为什么不推荐使用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方法。