java - JPasswordField.getPassword() 仍然不安全?

标签 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”

按回车键,查看密码是否正确。 (我删除了输入的密码,删除和不删除最终结果是一样的)

此时,由于

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

我希望内存中不会有任何遗留问题,但事实确实如此。 我用过http://www.sweetscape.com/010editor/检查内存内容并仍然以明文形式看到“bugaboo” 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/

相关文章:

java - 如何从项目中删除jar文件?

c - 尽管设置了 rfcomm 安全性,Bluez hcidump 仍然清晰

encryption - 为什么 SSL 如此特别?我不能自己实现 RSA 吗?

java - 为什么是 PRG 模式而不是其他模式?

python - 大数据pyplot中内存错误

image - RGB 到标准 rgb 转换。矢量化

python - Python如何判断两个字符串是否相同

java - 如何制作一个包含多个复选框的表格

java - 解决 Java 中的传递依赖冲突

java - 迁移到 weblogic 上的 logback,但不记录日志