相关疑难解决方法(0)

为什么JPasswordField.getPassword()会创建一个包含密码的String?

Swing的JPasswordFieldgetPassword()一个返回字符数组的方法.我对此的理解是,数组可以在使用后立即归零,这样你就不会在内存中长时间存在敏感的东西.检索密码的旧方法是使用getText(),它返回一个String对象,但它已被弃用.

所以,我的问题是为什么Java在检索过程中实际使用它getPassword()?为了更清楚,我正在调试我的测试应用程序的其他东西**,我跟着调用和爆炸... getText()JPasswordField被调用,当然,一个很好的String对象与我的密码已经创建,现在挂在内存.

亲自尝试一下:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

跟进问题:这种"隐藏"的getText()危险用途是什么?当然,如果一个专门的攻击者破坏了系统,它会获得你的密码,我说的是一个不那么专注的密码;)

**我在寻找一种在不使用String对象的情况下在Swing组件上实际显示一些敏感数据的方法时遇到了这个问题.显然除非我愿意重写Swing API的部分(全部?),否则无法做到这一点.不会发生.

java security passwords swing

27
推荐指数
3
解决办法
9万
查看次数

标签 统计

java ×1

passwords ×1

security ×1

swing ×1