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)
这样做的原因是,如果您要求将密码作为字符串而不是字符数组,则包含密码的字符串现在将在Java运行时的内存中浮动一段时间.可以想象,可以从那里读取流氓Java组件或外部程序.
通过使用char数组,您可以验证密码,然后立即对其进行加密.
这种行为背后的原因是Java字符串池(有关详细信息,请参阅此SO问题).只要将该密码字段的内容转换为a String(如果使用该getText方法就会发生这种情况),String就会将其放入池中,并且可以被其他人读取.
如果你看看getPassword方法的实现(可以在SO问题 @Garbage中看到你的问题发表评论),你可以看到这个小心避免创建一个String.
请注意,这也意味着你不应该做类似的事情
if ( Arrays.equals( "mySuperSecretPassword".toCharArray(), passwordField.getPassword() ) )
Run Code Online (Sandbox Code Playgroud)
或者您仍然最终将密码放入池中,然后您可以轻松地使用该getText方法.
| 归档时间: |
|
| 查看次数: |
48479 次 |
| 最近记录: |