我从来没有想过,只是我用的方法getPassword
那久违的字符数组,我已经看到了getText
方法已被否决 。 但现在,我想,为什么这个方法被废弃 ?
Java文档解释:
已过时 。 从Java 2平台v1.2,取而代之的是
getPassword
。取入由该组件代表的文本的一部分。 如果长度为0,则返回一个空字符串。
出于安全原因,这种方法已被弃用。 使用
getPassword
方法来代替。
但什么是这些安全方面的原因 ? 这个任何想法?
先感谢您。
我从来没有想过,只是我用的方法getPassword
那久违的字符数组,我已经看到了getText
方法已被否决 。 但现在,我想,为什么这个方法被废弃 ?
Java文档解释:
已过时 。 从Java 2平台v1.2,取而代之的是
getPassword
。取入由该组件代表的文本的一部分。 如果长度为0,则返回一个空字符串。
出于安全原因,这种方法已被弃用。 使用
getPassword
方法来代替。
但什么是这些安全方面的原因 ? 这个任何想法?
先感谢您。
当调用getText
你可能不被改变(除了反射)的字符串(不可变对象)等的密码留在内存中,直到垃圾收集。
当调用getPassword
你得到一个字符数组可以被修改,因此密码会真的没有记忆里。
试试这个 :
String myPass=String.valueOf(passwordField.getPassword());
这样做的原因是,如果你作为一个字符串,而不是作为一个字符数组要求输入密码,包含口令此字符串现在要在Java运行时的内存漂浮的时间一定数额不详。 它可以从那里通过流氓Java组件或外部程序读取可以想象。
通过使用字符数组代替,你可以验证密码,然后立即打乱它。
这种行为背后的原因是java字符串处理池(例如参见这太问题的更多信息)。 只要你转换该密码字段的内容,以一个String
(这是如果你使用会发生什么getText
方法)的String
可以被别人看到被放置在游泳池和。
如果你想看看的实施getPassword
的方法(如可在可见SO问题 @Garbage张贴在你的问题中留言),你可以看到这个精心避免创建一个String
。
请注意,这也意味着你不应该这样做
if ( Arrays.equals( "mySuperSecretPassword".toCharArray(), passwordField.getPassword() ) )
或者你还结了把密码池中,然后你可以容易地使用了getText
方法。