4

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

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

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

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

密码对话框

输入“bugaboo”

点击回车,查看密码是否正确。(我删除了输入的密码,有/没有这个删除,最终结果是一样的)

现在在这一点上,由于代码中清除密码内容

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

我希望内存中没有剩余的 bugaboo,但是有。我使用http://www.sweetscape.com/010editor/检查内存内容,仍然以明文形式看到“bugaboo” bugaboo

结论:这样做的原因是 JpasswordField 在内部使用 PlainDocument 并且它在您的记忆中留下了所键入内容的整个历史记录。因此您无法完全清除内存中的密码明文。

因此,使用 getPassword() 作为 char[] 并在之后清除它并没有太大的好处。

请赐教。

4

1 回答 1

0

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

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

passwordField.setText("");

具有讽刺意味的是,这引发了一个UndoableEditEvent包含javax.swing.text.GapContent$RemoveUndo对象,该对象将密码存储为String对象——这是我们一开始就试图避免的。

于 2016-04-24T21:00:07.213 回答