很抱歉再次提出这个话题,我已经仔细阅读了另一个类似的问题
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 []并随后将其清除的工作并没有太大好处。
请赐教。
最佳答案
从JPasswordField
检索密码时,您只会得到一个副本。 Document
中的JPasswordField
对象仍然具有自己的包含密码的字符数组。我想这就是您在内存查看器中看到的值。
现在,一个想法是在验证密码后清除JPasswordField
:
passwordField.setText("");
具有讽刺意味的是,这将引发一个包含
UndoableEditEvent
对象的javax.swing.text.GapContent$RemoveUndo
,该对象将密码存储为String
对象-我们首先试图避免这种情况。