首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JPasswordField.getPassword()的安全原因是什么?

JPasswordField.getPassword()的安全原因是什么?
EN

Stack Overflow用户
提问于 2012-01-06 19:38:51
回答 3查看 1.4K关注 0票数 5

从Java1.2开始,“出于安全原因”,JPasswordField.getText()已经被弃用,鼓励使用getPassword()方法“为了更强的安全性”。

但是,我能够通过分析堆转储(JPasswordField instance -> model -> s -> array)获得存储在JPasswordField中的密码,至少在Oracle JRE1.7中是这样。

那么JPasswordField.getPassword()如何帮助保护密码呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-06 19:42:31

好吧,它的documentation声明:

为提高安全性,建议使用后清除返回的字符数组,将每个字符设置为0。

但是,当然,如果您使用getText方法,您将得到一个不可变的字符串,因此您无法执行相同的建议。

票数 3
EN

Stack Overflow用户

发布于 2013-07-17 23:47:12

答案很简单。以下是解释getPassword()getText()之间差异的实用方法

代码语言:javascript
复制
JPasswordField jt=new JPasswordField("I am a password");
System.out.println("The text is "+jt.getText());
System.out.println("The password is "+jt.getPassword());

输出

代码语言:javascript
复制
I am a password
[C@1e4a47e

getPassword()方法返回char[]形式的密码,而getText()返回纯文本形式的密码,即String形式。

但是,如果您像这样打印,

代码语言:javascript
复制
System.out.println(new String(jt.getPassword()));

这相当于JPasswordField中的getText()。然而,这并不意味着getPassword()在内部使用getText(),然后将其转换为char数组。

getPassword()方法使用非字符串接口,即Segment。但是,Segment也是不可变的,但是getPassword()方法从Segment获取字符数组并返回它。

然而,由于String是不可变的,而char[]不是,所以char[]被认为是非常安全的,因为它可以被清除。

票数 2
EN

Stack Overflow用户

发布于 2012-01-06 19:44:19

尽管getPassword()在内部使用getText(),但仍有安全说明

虽然JPasswordField类继承了getText方法,但您应该改用getPassword方法。getText不仅不太安全,而且将来可能会返回可见的字符串(例如,"**")而不是键入的字符串。

为了进一步增强安全性,处理完由getPassword方法返回的字符数组后,应该将它的每个元素设置为零。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8757266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档