为什么不推荐使用JPasswordField中的getText()?
我之前从未想过,只是我使用了返回字符数组的方法getPassword
,并且我已经看到了不推荐使用 getText
方法。 但是现在我想,为什么这种方法被弃用了 ?
Java文档说明:
不推荐 。 从Java 2平台v1.2开始,由
getPassword
取代。获取组件表示的部分文本。 如果length为0,则返回空字符串。
出于安全原因,不推荐使用此方法。 请改用
getPassword
方法。
但那些安全原因是什么? 关于这个的任何想法?
先谢谢你。
调用getText
会得到一个可能无法更改的String(不可变对象)(reflection除外),因此密码会保留在内存中,直到收集垃圾为止。
调用getPassword
您会得到一个可能被修改的char数组,因此密码将不会留在内存中。
这样做的原因是,如果您要求将密码作为字符串而不是字符数组,则包含密码的字符串现在将在Java运行时的内存中浮动一段时间。 可以想象,可以从那里读取流氓Java组件或外部程序。
通过使用char数组,您可以validation密码,然后立即加扰它。
尝试这个 :
String myPass=String.valueOf(passwordField.getPassword());
这种行为背后的原因是Java字符串池(有关详细信息,请参阅此SO问题 )。 只要将该密码字段的内容转换为String
(如果使用getText
方法就会发生这种情况), String
就会被放置在池中,并且可以被其他人读取。
如果你看一下getPassword
方法的实现(可以在SO问题中看到@Garbage作为你的问题的评论发布),你可以看到这个小心地避免创建一个String
。
请注意,这也意味着你不应该做类似的事情
if ( Arrays.equals( "mySuperSecretPassword".toCharArray(), passwordField.getPassword() ) )
或者您仍然最终将密码放入池中,然后您可以轻松地使用getText
方法。