带动作命令的JPasswordField安全性

Ygg*_*sil 6 java security swing jpasswordfield

JPasswordField在我的程序中使用了一个.当我问getPassword(),我得到一个char[]数组.但是,当我添加ActionListenerJPasswordField,问getActionCommand(),我得到的密码作为String.此密码是否在事件对象中保存为String这不是一个安全问题吗?

Jav*_*cal 3

当组件没有设置动作命令时,组件中的文本就是动作命令。这就是您获得密码的原因。

甚至为JTextField

JTextField jt=new JTextField("text");
        jt.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent ae)
            {
                System.out.println(ae.getActionCommand());
            }
        });
Run Code Online (Sandbox Code Playgroud)

这是一个安全问题,因为您获取的密码是不可变的字符串而不是char[]

每当未设置显式操作命令时,组件中的文本将被发送到ActionEvent构造函数,尽管您没有专门将其设置为操作命令。参数虽然command可以null,但不建议为null,因此组件中的文本默认为动作命令。如果没有密码,则JPasswordField空字符串将是操作命令。

不要尝试将操作命令设置为null,如果是null,则 中的文本JPasswordField将是操作命令。问题又来了。

因此,我建议您设置一些操作命令,JPasswordField暂时不要保留它,直到 Oracle 纠正此问题。

JPasswordField jt=new JPasswordField("text");
        jt.setActionCommand("");
        jt.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent ae)
            {
                System.out.println(ae.getActionCommand());
            }
        });
Run Code Online (Sandbox Code Playgroud)