JPasswordField.getPassword()仍然没有安全保障?

时间:2016-04-24 18:03:01

标签: java security memory jpasswordfield

很抱歉再次提起这个话题,我仔细阅读了另一个类似的问题 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

然后运行它。它将打开密码对话框。

password dialog

键入" bugaboo"

按Enter键并查看密码是否正确。 (我删除输入的密码,最终结果与/不删除相同)

现在,此时,由于代码清除了

中的密码内容
    //Zero out the password.
    Arrays.fill(correctPassword,'0');

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

结论:原因是JpasswordField在内部使用了PlainDocument,并且它记录了内存的整个历史记录。因此,您无法完全清除内存中的密码明文。

因此,将getPassword()用作char []并在之后清除它的努力并没有多大好处。

请赐教。

1 个答案:

答案 0 :(得分:0)

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

现在的想法是在验证密码后清除JPasswordField

passwordField.setText("");

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