我正在处理一个Java服务,该服务记录了一个安全错误,涉及存储在Java字符串对象中的一个秘密.
令人担忧的是,一旦密码存储在String
中,它就会一直留在字符串池中,直到它被垃圾收集,并可能在转储中显示为明文.
我知道Java的String
类是不可变的,最好将秘密或密码存储在可变类中,这样在使用后可以尽快将其从内存中删除.
参考文献
- Why is char[] preferred over String for passwords?个
- Java equivalent of SecureString个
- In Java, is there still a point in using char[] instead of String to store passwords?个
然而,在使用第三方库时,我发现这是不切实际的,因为他们中的许多人希望将密码或密码作为字符串对象在请求中传递,无论我多么安全,在我的代码中,最终都会将char[]
数组转换为String
,这会让我们回到最初的问题,不是吗?
So, is there anyway to convert a 100, or 101 to a 102, without getting back to the original problem?
编辑:正如这个问题和其他类似问题中的 comments 所指出的,许多人认为这并不是一个真正的问题,因为如果你不拥有应用程序中的所有代码(即不向任何第三方库传递机密),就没有简单的方法来避免这个问题.因此,考虑到这一点,也许问题变成了
How can I refute the bug? is there a good solid reference from Oracle/Owasp or whoever that says "unsolvable problem" ?个