JPasswordField.getPassword()的安全原因是什么?

时间:2012-01-06 11:38:51

标签: java security swing passwords jpasswordfield

自Java 1.2以来,JPasswordField.getText()已被弃用“出于安全原因”,因此强行使用getPassword()方法“以获得更强的安全性。”

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

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

3 个答案:

答案 0 :(得分:3)

嗯,documentation表示:

  

为了更强的安全性,建议在使用后通过将每个字符设置为零来清除返回的字符数组。

但是,当然,如果你使用getText方法,你会得到一个不可变的String,所以你不能执行相同的推荐。

答案 1 :(得分:1)

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

  

虽然JPasswordField类继承了getText方法,但是   应该使用getPassword方法。 getText不仅更少   安全,但将来可能会返回可见的字符串(for   例如," ** ")而不是键入的字符串。

     

为了进一步增强安全性,一旦完成角色   getPassword方法返回的数组,你应该设置它的每一个   元素为零。

答案 2 :(得分:1)

答案很简单。这是一种实用的方法,可以解释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()方法将密码返回为char[],而getText()将密码作为纯文本返回,即以String的形式返回。

但是,如果你这样打印,

System.out.println(new String(jt.getPassword()));

这与getText()中的JPasswordField非常相等。但是,这并不意味着getPassword()在内部使用getText(),然后将其转换为char数组。

getPassword()方法使用非字符串API,即Segment。但是,Segment再次是不可变的,但getPassword()方法从Segment带来char数组并返回它。

然而,由于String是不可变的而char[]不是,char[]被认为是非常安全的,因为它可以被删除。