【发布时间】:2010-11-02 07:23:44
【问题描述】:
Swing 的 JPasswordField 具有返回 char 数组的 getPassword() 方法。我对此的理解是,数组可以在使用后立即归零,这样你就不会在内存中长时间徘徊敏感的东西。找回密码的旧方法是使用getText(),它返回一个字符串对象,但它已被弃用。
所以,我的问题是为什么 Java 在使用 getPassword() 的检索过程中实际使用它?更清楚地说,我正在调试我的测试应用程序以获取其他内容**,我跟着调用并砰的一声...... JPasswordField 中的getText() 被调用了,当然,已经创建了一个带有我密码的漂亮字符串对象,并且现在是在记忆中徘徊。
自己试试吧:
public class PasswordTest() {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPasswordField passField = new JPasswordField();
pass.addActionListener(new ActionListener() {
public ActionPerformed(ActionEvent evt) {
char[] p = passField.getPassword(); // put breakpoint
// do something with the array
}
});
frame.add(passField);
frame.setVisible(true);
frame.pack();
}
}
跟进问题:getText() 的这种“隐藏”使用是否有任何危险?当然,如果专门的攻击者破坏了系统,它会获取您的密码,我说的是不那么专门的攻击者;)
**我在寻找一种在 Swing 组件上实际显示一些敏感数据而不使用 String 对象的方法时遇到了这个问题。除非我愿意重写 Swing API 的一部分(全部?),否则显然没有办法做到这一点。不会发生。
【问题讨论】:
-
我质疑您需要重写 Swing API 以显示敏感数据的说法。你能为此制作一个自定义组件,它扩展 JComponent 并覆盖paintComponent吗?然后由您决定如何处理文本。
标签: java security swing passwords