覆盖Java中的字符串密码



我犯了一个错误,即在Java程序中将密码作为字符串存储。我想防止此字符串密码出现在堆转储/内存转储中。理想情况下,我应该使用char []并在使用后用零填充它(按照本文的建议-https://nvisium.com/resources/blog/2016/03/03/31/secure-password-strings.html(。

我读了一些帖子,并理解字符串是不可变的,它们不能被覆盖。我的问题是 - 是否没有办法替换已经用零创建的字符串的内容?

注意:我无法将实现更改为使用char [],因为我从返回字符串的模块/库中获取此字符串。

由于字符串是不可变的,所以简短的答案是否定的,您不能像在C或C 中与零相同的内存区域覆盖相同的内存区域。您可以做的就是发布对该字符串的任何引用,最终最终 将从堆中释放内存空间,并且不会出现在堆转储中。问题在于,GC的时间变化很大,并且在您的控制之下不大。

您可以要求系统到GC,但这不能保证它会这样做。这更暗示。此外,即使应该出现GC,在您的提示或自己的主动性中发生GC,也不能保证该字符串将在任何特定的GC运行期间收集。这种行为不仅在JVM版本之间,而且在潜在使用不同GC方案的JVM版本之间会有所不同。您可以在命令行上设置该方案:

-XX:-UseConcMarkSweepGC

简而言之

我提前道歉。

最新更新