在java中取消字符串是一种好的做法吗?
我在将普通密码作为字符串存储在内存中时遇到问题。根据参考,由于字符串是不可变的,因此存在将字符串数据类型用于存储在内存中的敏感数据的漏洞。
https://www.geeksforgeeks.org/use-char-array-string-storing-passwords-java/
我可以通过使字符串变量无效而不是使用char数组或字符串缓冲区/构建器来克服此安全问题吗?
例如:字符串密码=“密码”;密码 = 空;
我在将普通密码作为字符串存储在内存中时遇到问题。根据参考,由于字符串是不可变的,因此存在将字符串数据类型用于存储在内存中的敏感数据的漏洞。
https://www.geeksforgeeks.org/use-char-array-string-storing-passwords-java/
我可以通过使字符串变量无效而不是使用char数组或字符串缓冲区/构建器来克服此安全问题吗?
例如:字符串密码=“密码”;密码 = 空;
不。使字符串无效只会取消引用的链接。但该值仍将存在于字符串池中。因为为了节省内存,字符串值保留在字符串池中。
任何潜在的黑客都可以通过获取对字符串池的访问权限来检索值。
然而,使用char[],您可以简单地将该对象视为任何其他对象。取消 char 对象将在垃圾回收时从堆中擦除数据。
更好的选择是使用字节数组。
阅读有关字符串常量池的更多信息。
如果你想要绝对的安全,不。将字符串清空不是正确的解决方案。
这样做的原因是,将其清空并不能保证字符串不再可用。虽然它可能会使它更有可能被垃圾回收(这只是一个“可能”),但不能保证何时(甚至是否)它会被垃圾回收。
您应该使用字节数组或 char 数组,然后在完成后为数组中的每个元素清空。