很抱歉再次提起这个话题,我仔细阅读了另一个类似的问题 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
然后运行它。它将打开密码对话框。
键入" bugaboo"
按Enter键并查看密码是否正确。 (我删除输入的密码,最终结果与/不删除相同)
现在,此时,由于代码清除了
中的密码内容 //Zero out the password.
Arrays.fill(correctPassword,'0');
我希望内存中没有剩余的bugaboo,但是有。 我使用http://www.sweetscape.com/010editor/来检查内存内容,但仍然看到" bugaboo"用明文
结论:原因是JpasswordField在内部使用了PlainDocument,并且它记录了内存的整个历史记录。因此,您无法完全清除内存中的密码明文。
因此,将getPassword()用作char []并在之后清除它的努力并没有多大好处。
请赐教。
答案 0 :(得分:0)
当您从JPasswordField
检索密码时,您只需获得一份副本。 Document
中的JPasswordField
对象仍然有一个包含密码的自己的字符数组。我想这是你在内存查看器中看到的值。
现在的想法是在验证密码后清除JPasswordField
:
passwordField.setText("");
具有讽刺意味的是,这会引发包含UndoableEditEvent
对象的javax.swing.text.GapContent$RemoveUndo
,该对象将密码存储为String
对象 - 这是我们首先尝试避免的。