自Java 1.2以来,JPasswordField.getText()
已被弃用“出于安全原因”,因此强行使用getPassword()
方法“以获得更强的安全性。”
但是,通过分析堆转储(JPasswordField
),我能够至少在Oracle JRE 1.7中获取存储在JPasswordField instance -> model -> s -> array
中的密码。
那么JPasswordField.getPassword()
如何帮助保护密码?
答案 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[]
被认为是非常安全的,因为它可以被删除。