我将普通密码作为字符串存储在内存中时出现问题。根据参考资料,由于字符串是不可变的,因此存在使用String数据类型存储在内存中的敏感数据的漏洞。
https://www.geeksforgeeks.org/use-char-array-string-storing-passwords-java/
Why is char[] preferred over String for passwords?
我是否可以通过使字符串变量无效而不是使用char数组或字符串缓冲区/构建器来克服此安全问题。
例如:String password =“password”; password = null;
答案 0 :(得分:6)
没有。对字符串进行无效操作只会延迟引用。但该值仍将存在于字符串池中。因为为了节省内存,字符串值保留在字符串池中。
任何潜在的黑客都可以通过访问字符串池来检索该值。
然而,使用char [],您可以简单地将该对象视为任何其他对象。并且取消char对象将在垃圾收集时擦除堆中的数据。
更好的选择是使用字节数组。
详细了解String Constant pool。
答案 1 :(得分:2)
如果你想要绝对安全,不。取消String并不是正确的解决方案。
这样做的原因是将其归零不能保证String不再可用。虽然它可能使它更有可能被垃圾收集(这只是一个'可能'),但是不能保证何时(或者甚至)它将被垃圾收集。
您应该使用字节数组或char数组,然后在完成后使数组中的每个元素都为空。