Swing的
JPasswordField有一个返回char数组的
getPassword()方法。我的理解是,数组可以立即归零使用后,所以你没有敏感的东西挂在内存中很长时间。检索密码的旧方法是使用getText(),它返回一个String对象,但它已被弃用。
所以,我的问题是为什么它实际上正在使用的Java在检索过程中使用getPassword()?更清楚的是,我正在调试我的测试应用程序的东西其他**,我跟随调用和轰炸…调用JPasswordField的getText(),当然,一个很好的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();
}
}
后续问题:这是’隐藏’使用getText()危险的任何方式?当然,一个专门的攻击者会得到你的密码,如果它已经危害系统,我说的不太专业的;
**我遇到了这个,而我正在寻找一种方法来实际显示一些敏感数据在Swing组件,而不使用String对象。显然没有办法,除非我愿意重写Swing API的一部分(所有?)。不会发生。