自 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 方法返回的字符数组,您应该将其每个元素设置为零。