为什么不推荐使用JPasswordField中的getText()?

Pau*_*gas 29 java swing jpasswordfield

我从来没有想过,只有我使用getPassword返回字符数组的方法,我看到该getText方法已被弃用.但是现在我想,为什么这种方法被弃用了

Java文档说明:

不推荐.从Java 2平台v1.2开始,取而代之getPassword.

获取组件表示的部分文本.如果length为0,则返回空字符串.

出于安全原因,不推荐使用此方法.请改用该getPassword方法.

但那些安全原因是什么?有关于此的任何想法?

先感谢您.

MBy*_*ByD 45

在调用时,getText您将获得一个可能无法更改的String(不可变对象)(反射除外),因此密码会保留在内存中,直到收集垃圾为止.

在调用时getPassword会得到一个可能被修改的char数组,因此密码将不会留在内存中.


小智 15

试试这个 :

String myPass=String.valueOf(passwordField.getPassword());
Run Code Online (Sandbox Code Playgroud)

  • OP没有询问*如何以“字符串”的形式获取密码*;他在问*为什么密码以“ CharrArray”而不是“ String”的形式返回。 (2认同)

Zar*_*nen 8

这样做的原因是,如果您要求将密码作为字符串而不是字符数组,则包含密码的字符串现在将在Java运行时的内存中浮动一段时间.可以想象,可以从那里读取流氓Java组件或外部程序.

通过使用char数组,您可以验证密码,然后立即对其进行加密.


Rob*_*bin 5

这种行为背后的原因是Java字符串池(有关详细信息,请参阅此SO问题).只要将该密码字段的内容转换为a String(如果使用该getText方法就会发生这种情况),String就会将其放入池中,并且可以被其他人读取.

如果你看看getPassword方法的实现(可以在SO问题 @Garbage中看到你的问题发表评论),你可以看到这个小心避免创建一个String.

请注意,这也意味着你不应该做类似的事情

if ( Arrays.equals( "mySuperSecretPassword".toCharArray(), passwordField.getPassword() ) )
Run Code Online (Sandbox Code Playgroud)

或者您仍然最终将密码放入池中,然后您可以轻松地使用该getText方法.