5

自 Java 1.2 以来,JPasswordField.getText()“出于安全原因”已被弃用,鼓励使用getPassword()方法“以增强安全性”。

但是,通过分析堆转储 ( ) ,我能够获得JPasswordField至少存储在 Oracle JRE 1.7 中的密码。JPasswordField instance -> model -> s -> array

那么如何JPasswordField.getPassword()帮助保护密码呢?

4

3 回答 3

3

好吧,它的文档指出:

为了增强安全性,建议使用后将返回的字符数组清零,将每个字符设置为零。

但是,当然,如果你使用这个getText方法,你会得到一个字符串,它是不可变的,所以你不能执行同样的建议。

于 2012-01-06T11:42:31.350 回答
2

答案很简单。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[]被认为是非常安全的,因为它可以被清除。

于 2013-07-17T15:47:11.933 回答
1

安全说明虽然 getPassword() 在内部使用 getText()

虽然 JPasswordField 类继承了 getText 方法,但您应该改用 getPassword 方法。不仅 getText 不那么安全,而且将来它可能会返回可见字符串(例如,“ ** ”)而不是键入的字符串。

为了进一步增强安全性,一旦您完成了 getPassword 方法返回的字符数组,您应该将其每个元素设置为零。

于 2012-01-06T11:44:18.777 回答