我错误地将密码存储为Java程序中的String。我想阻止此String密码出现在堆转储/内存转储中。理想情况下,我应该使用char []并在使用后将其填充为零(根据本文的建议 - https://nvisium.com/resources/blog/2016/03/31/secure-password-strings.html)。
我阅读了一些SO帖子并理解字符串是不可变的,它们不能被覆盖。我的问题是 - 有没有办法替换已经用零创建的字符串的内容?
注意:我现在无法更改我的实现以使用char [],因为我从返回String的模块/库中获取此String。
答案 0 :(得分:1)
由于字符串是不可变的,简短的答案是否定的,你不能像在C或C ++中那样用零覆盖相同的内存区域。您可以做的是释放对该String的任何引用,最终将从堆中释放内存空间,并且不会出现在堆转储中。问题是GC的时间变化很大,并且不在你的控制之下。
您可以向GC要求系统,但这并不能保证它会这样做。这更像是一种暗示。此外,即使GC出现,在您提示或主动进行时,也无法保证在任何特定GC运行期间都会收集字符串。此行为不仅可以在JVM版本之间有所不同,而且可能在可能使用不同GC方案的JVM版本中有所不同。您可以在命令行上设置方案作为示例:
putc
简而言之,唯一可靠的方法是防止内存中存在密码字符串。
我提前为一个答案的惨淡道歉。