从Java1.2开始,“出于安全原因”,JPasswordField.getText()已经被弃用,鼓励使用getPassword()方法“为了更强的安全性”。
但是,我能够通过分析堆转储(JPasswordField instance -> model -> s -> array)获得存储在JPasswordField中的密码,至少在Oracle JRE1.7中是这样。
那么JPasswordField.getPassword()如何帮助保护密码呢?
发布于 2012-01-06 19:42:31
好吧,它的documentation声明:
为提高安全性,建议使用后清除返回的字符数组,将每个字符设置为0。
但是,当然,如果您使用getText方法,您将得到一个不可变的字符串,因此您无法执行相同的建议。
发布于 2013-07-17 23:47:12
答案很简单。以下是解释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@1e4a47egetPassword()方法返回char[]形式的密码,而getText()返回纯文本形式的密码,即String形式。
但是,如果您像这样打印,
System.out.println(new String(jt.getPassword()));这相当于JPasswordField中的getText()。然而,这并不意味着getPassword()在内部使用getText(),然后将其转换为char数组。
getPassword()方法使用非字符串接口,即Segment。但是,Segment也是不可变的,但是getPassword()方法从Segment获取字符数组并返回它。
然而,由于String是不可变的,而char[]不是,所以char[]被认为是非常安全的,因为它可以被清除。
发布于 2012-01-06 19:44:19
尽管getPassword()在内部使用getText(),但仍有安全说明
虽然JPasswordField类继承了getText方法,但您应该改用getPassword方法。getText不仅不太安全,而且将来可能会返回可见的字符串(例如,"**")而不是键入的字符串。
为了进一步增强安全性,处理完由getPassword方法返回的字符数组后,应该将它的每个元素设置为零。
https://stackoverflow.com/questions/8757266
复制相似问题