抱歉再次提起这个话题,我已经仔细阅读了另一个类似的问题 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”
按回车键,查看密码是否正确。 (我删除了输入的密码,删除和不删除最终结果是一样的)
此时,由于
中清除密码内容的代码 //Zero out the password.
Arrays.fill(correctPassword,'0');
我希望内存中不会有任何遗留问题,但事实确实如此。 我用过http://www.sweetscape.com/010editor/检查内存内容并仍然以明文形式看到“bugaboo”
结论:造成这种情况的原因是 JpasswordField 内部使用 PlainDocument,它会用键入内容的整个历史记录填充您的内存。因此您无法完全清除内存中的密码明文。
因此,使用 getPassword() 作为 char[] 并随后清除它并没有多大好处。
请赐教。
最佳答案
当您从 JPasswordField
检索密码时,您只会得到一个副本。 JPasswordField
中的 Document
对象仍然有一个自己的包含密码的字符数组。我想这就是您在内存查看器中看到的值。
现在,一个想法是在验证密码后清除 JPasswordField
:
passwordField.setText("");
讽刺的是,这会引发一个 UndoableEditEvent
,其中包含一个 javax.swing.text.GapContent$RemoveUndo
对象,该对象将密码存储为 String
对象 - 某些东西我们一开始就试图避免这种情况。
关于java - JPasswordField.getPassword() 仍然不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36826917/