我在存储明文密码的字符串时遇到了问题。根据参考资料,由于字符串是不可变的,因此在内存中使用字符串数据类型来存储敏感数据存在漏洞。
https://www.geeksforgeeks.org/use-char-array-string-storing-passwords-java/
我能否通过将字符串变量设置为null来解决这个安全问题,而不是使用char数组或String缓冲区/构建器。
例如:String password = "password"; password = null;
我在存储明文密码的字符串时遇到了问题。根据参考资料,由于字符串是不可变的,因此在内存中使用字符串数据类型来存储敏感数据存在漏洞。
https://www.geeksforgeeks.org/use-char-array-string-storing-passwords-java/
我能否通过将字符串变量设置为null来解决这个安全问题,而不是使用char数组或String缓冲区/构建器。
例如:String password = "password"; password = null;
将字符串设为null只是取消了其引用,但该值仍会存在于字符串池中,因为为了节约内存,字符串值会保留在字符串池中。
任何潜在的黑客都可以通过访问字符串池来检索值。
而使用char[],您可以将该对象简单地视为任何其他对象。将char对象设置为null将在垃圾收集时从堆中清除数据。
更好的选择是使用字节数组。
阅读有关字符串常量池的更多信息。
intern()
,那么它才会被放入字符串池中。这更多地是关于控制密码在内存中的生命周期。使用 char[]
的建议是正确的,但是需要在使用后将其清空,仅将其设置为 null 是不够的。 - KayamanSystem.gc()
仅仅是暗示你想要进行GC,但并不保证它会真正执行任何操作)。 - Andy Turner