为什么 JPasswordField.getPassword() 创建一个包含密码的字符串?
Swing 的 JPasswordField
具有返回 char 数组的 getPassword()
方法。我对此的理解是,数组可以在使用后立即归零,这样您就不会在内存中长时间徘徊敏感事物。检索密码的旧方法是使用 ,它返回一个 String 对象,但它已被弃用。getText()
所以,我的问题是为什么Java在检索过程中实际上使用它,使用???为了更清楚,我正在调试我的测试应用程序以获取其他内容**,我按照调用并敲击... in 被调用,当然,一个带有我的密码的漂亮的 String 对象已经创建,现在正在内存周围悬挂。getPassword()
getText()
JPasswordField
亲自尝试一下:
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 组件上实际显示一些敏感数据的方法时遇到了这个问题。显然,除非我愿意重写Swing API的一部分(全部?),否则没有办法做到这一点。不会发生。String