为什么的getText()在JPasswordField中被弃用?为什么的getText()在JPa

2019-05-13 20:18发布

我从来没有想过,只是我用的方法getPassword那久违的字符数组,我已经看到了getText方法已被否决 。 但现在,我想,为什么这个方法被废弃

Java文档解释:

已过时从Java 2平台v1.2,取而代之的是getPassword

取入由该组件代表的文本的一部分。 如果长度为0,则返回一个空字符串。

出于安全原因,这种方法已被弃用。 使用getPassword方法来代替。

但什么是这些安全方面的原因 ? 这个任何想法?

先感谢您。

Answer 1:

当调用getText你可能不被改变(除了反射)的字符串(不可变对象)等的密码留在内存中,直到垃圾收集。

当调用getPassword你得到一个字符数组可以被修改,因此密码会真的没有记忆里。



Answer 2:

试试这个 :

String myPass=String.valueOf(passwordField.getPassword());


Answer 3:

这样做的原因是,如果你作为一个字符串,而不是作为一个字符数组要求输入密码,包含口令此字符串现在要在Java运行时的内存漂浮的时间一定数额不详。 它可以从那里通过流氓Java组件或外部程序读取可以想象。

通过使用字符数组代替,你可以验证密码,然后立即打乱它。



Answer 4:

这种行为背后的原因是java字符串处理池(例如参见这太问题的更多信息)。 只要你转换该密码字段的内容,以一个String (这是如果你使用会发生什么getText方法)的String可以被别人看到被放置在游泳池和。

如果你想看看的实施getPassword的方法(如可在可见SO问题 @Garbage张贴在你的问题中留言),你可以看到这个精心避免创建一个String

请注意,这也意味着你不应该这样做

if ( Arrays.equals( "mySuperSecretPassword".toCharArray(), passwordField.getPassword() ) )

或者你还结了把密码池中,然后你可以容易地使用了getText方法。



文章来源: Why getText() in JPasswordField was deprecated?