抱歉再次提出这个话题,我已经仔细阅读了另一个类似的问题 Why does JPasswordField.getPassword() create a String with the password in it?
但是我仍然认为 JpasswordField 实现存在漏洞。我仍然看到密码可能以不同的数据类型存储在内存中,而不是字符串。
并运行它。它将弹出密码对话框。
输入“bugaboo”
点击回车,查看密码是否正确。(我删除了输入的密码,有/没有这个删除,最终结果是一样的)
现在在这一点上,由于代码中清除密码内容
//Zero out the password.
Arrays.fill(correctPassword,'0');
我希望内存中没有剩余的 bugaboo,但是有。我使用http://www.sweetscape.com/010editor/检查内存内容,仍然以明文形式看到“bugaboo”
结论:这样做的原因是 JpasswordField 在内部使用 PlainDocument 并且它在您的记忆中留下了所键入内容的整个历史记录。因此您无法完全清除内存中的密码明文。
因此,使用 getPassword() 作为 char[] 并在之后清除它并没有太大的好处。
请赐教。