很抱歉再次提出这个话题,我已经仔细阅读了另一个类似的问题
Why does JPasswordField.getPassword() create a String with the password in it?

但是我仍然认为JpasswordField实现中存在漏洞。我仍然看到密码可能以不同的数据类型而不是字符串存储在内存中。

我执行的步骤:
从Oracle下载JPasswordField演示代码
https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/uiswing/examples/components/PasswordDemoProject/src/components/PasswordDemo.java

并运行它。它将弹出密码对话框。

java - JPasswordField.getPassword()仍然不安全吗?-LMLPHP

输入“ bugaboo”

按Enter键,然后确认密码正确。
(我删除了键入的密码,使用/不使用此删除操作,最终结果相同)

现在,由于清除密码内容的代码

    //Zero out the password.
    Arrays.fill(correctPassword,'0');


我希望内存中没有剩余的bugaboo,但是有。
我使用http://www.sweetscape.com/010editor/来检查内存内容,但仍以明文形式看到“ bugaboo”
java - JPasswordField.getPassword()仍然不安全吗?-LMLPHP

结论:这样做的原因是JpasswordField在内部使用PlainDocument,并且它会在键入内容的整个历史中浪费您的内存。因此,您无法完全清除内存中的密码清除文本。

因此,将getPassword()用作char []并随后将其清除的工作并没有太大好处。

请赐教。

最佳答案

JPasswordField检索密码时,您只会得到一个副本。 Document中的JPasswordField对象仍然具有自己的包含密码的字符数组。我想这就是您在内存查看器中看到的值。

现在,一个想法是在验证密码后清除JPasswordField

passwordField.setText("");


具有讽刺意味的是,这将引发一个包含UndoableEditEvent对象的javax.swing.text.GapContent$RemoveUndo,该对象将密码存储为String对象-我们首先试图避免这种情况。

09-25 22:15