自 Java 1.2 以来,JPasswordField.getText()“出于安全原因”已被弃用,鼓励使用getPassword()方法“以增强安全性”。
但是,通过分析堆转储 ( ) ,我能够获得JPasswordField至少存储在 Oracle JRE 1.7 中的密码。JPasswordField instance -> model -> s -> array
那么如何JPasswordField.getPassword()帮助保护密码呢?
自 Java 1.2 以来,JPasswordField.getText()“出于安全原因”已被弃用,鼓励使用getPassword()方法“以增强安全性”。
但是,通过分析堆转储 ( ) ,我能够获得JPasswordField至少存储在 Oracle JRE 1.7 中的密码。JPasswordField instance -> model -> s -> array
那么如何JPasswordField.getPassword()帮助保护密码呢?
答案很简单。getPassword()这是一种实用的方法,可以解释和之间的区别getText()
JPasswordField jt=new JPasswordField("I am a password");
System.out.println("The text is "+jt.getText());
System.out.println("The password is "+jt.getPassword());
输出
I am a password
[C@1e4a47e
该getPassword()方法返回密码 aschar[]而该方法getText()以纯文本形式返回密码,即String.
但是,如果您这样做打印,
System.out.println(new String(jt.getPassword()));
这与getText()in非常相似JPasswordField。但这并不意味着getPassword()在内部使用getText()然后将其转换为char数组。
该getPassword()方法使用非字符串 API,即Segment. 但是,它又Segment是不可变的,但是该getPassword()方法从 char 数组中获取Segment并返回它。
然而 asString是不可变的并且char[]不是,achar[]被认为是非常安全的,因为它可以被清除。
安全说明虽然 getPassword() 在内部使用 getText()
虽然 JPasswordField 类继承了 getText 方法,但您应该改用 getPassword 方法。不仅 getText 不那么安全,而且将来它可能会返回可见字符串(例如,“ ** ”)而不是键入的字符串。
为了进一步增强安全性,一旦您完成了 getPassword 方法返回的字符数组,您应该将其每个元素设置为零。