在java中取消字符串是一种好的做法吗?

2022-09-03 14:55:31

我在将普通密码作为字符串存储在内存中时遇到问题。根据参考,由于字符串是不可变的,因此存在将字符串数据类型用于存储在内存中的敏感数据的漏洞。

https://www.geeksforgeeks.org/use-char-array-string-storing-passwords-java/

为什么密码的 char[] 优先于 String?

我可以通过使字符串变量无效而不是使用char数组或字符串缓冲区/构建器来克服此安全问题吗?

例如:字符串密码=“密码”;密码 = 空;


答案 1

不。使字符串无效只会取消引用的链接。但该值仍将存在于字符串池中。因为为了节省内存,字符串值保留在字符串池中。

任何潜在的黑客都可以通过获取对字符串池的访问权限来检索值。

然而,使用char[],您可以简单地将该对象视为任何其他对象。取消 char 对象将在垃圾回收时从堆中擦除数据。

更好的选择是使用字节数组。

阅读有关字符串常量池的更多信息。


答案 2

如果你想要绝对的安全,不。将字符串清空不是正确的解决方案。

这样做的原因是,将其清空并不能保证字符串不再可用。虽然它可能会使它更有可能被垃圾回收(这只是一个“可能”),但不能保证何时(甚至是否)它会被垃圾回收。

您应该使用字节数组或 char 数组,然后在完成后为数组中的每个元素清空。