+ 首页>>技能>>实用技巧>>内容

技能为什么在密码问题上char[]优先于String?500+次围观

在Swing中,密码域(JPasswordField)用getPassword()函数(用来返回char[])取代getText()函数(返回字符串)。在工作中我得到类似的建议是不要用字符串去处理密码相关的问题,为什么涉及到密码问题时字符串会对安全构成威胁呢?(译注:这是提问者在Stackoverflow提了问题,他觉得用char[]处理密码并没有String方便,但为什么还要推荐使用char[]处理呢?下面是几个比较精彩的回答)。

回答一

String在Java中是不可变对象,这就意味着一旦创建了一个字符串,如果另一个进程把尝试内存的数据导出(dump),在GC进行垃圾回收之前该字符串会一直保留在内存中,那么该进程就可以轻易的读取到该字符串。
而对于数组,可以在该数组处理它之后再显示地擦掉数组中内容,可以以任何方式把数组内容覆盖掉,即使是GC触发前密码也不会出现在系统的任何地方。
所以,这是从安全角度来选择的,但是即便是用char[]也只是降低被攻击的概率而已,还是会有一些特定的手法攻破数组处理的密码。

回答二

从另一方面来,若是普通的字符串,有时你会不经意间打印密码到日志中或者其他不安全的地方,而char[] 就没那么显而易见。

public static void main(String[] args) {
    Object pw = "Password";
    System.out.println("String: " + pw);
 
    pw = "Password".toCharArray();
    System.out.println("Array: " + pw);
}

输出结果:

String: Password
Array: [C@5829428e

回答三

引用官方的文档,Java加密体系结构指南说到char[] vs String。在对象java.lang.String中收集和存储密码看似符合逻辑,但是字符串对象是不可变的,没有任何方法可以改变(重写)或清空内容。这一特性使得字符串对象不适合存储安全敏感信息,比如用户密码。你应当使用一个字符数组来代替,以便收集和存储安全敏感的信息。安全编码指南4.0也提到了类似的问题。

回答四

字符数组(char[])在使用之后里面的元素可以被清除,字符串并不如此。如果有人能以某种方式看到内存映像,如果字符串被使用了,它们可以以纯文本方式看到密码。但如果是char[], 看到的是清除后的数据(用0替换的数据),这种方式是安全的。

最后的思考

尽管使用char[]并不能保证足够安全,但我也建议使用hash’d或者加密的密码来代替普通的文本字符串密码,而且使用完后立即清除。

原文:http://stackoverflow.com/questions/8881291/why-is-char-preferred-over-string-for-passwords

+ 猜你喜欢...

  • 暂无推荐的相关日志.

===== 关于 DiggerPlus =====
DiggerPlus是国内新锐测试人垂直内容博客,专注于挖掘测试工具,普及测试技术,专注于测试人能力提升,博客上线后就受到广大测试人的热烈追捧;此外,DiggerPlus深度整合评测资源,揭秘科技数据和真相,让读者更懂科技,更好地把玩科技。 我们始终保持"独立,客观,严谨,优秀"的优良作风,努力为读者带来源源不断的优质内容。想访问更多酷毙的测试人网站?赶紧来DiggerPlus测试人网址导航看看吧!

===== DiggerPlus Team =====
DiggerPlus Team是DiggerPlus官方发起的团队,这是一群热爱科技,热爱测试,喜欢深度挖掘的热血测试人,他们是评测师,测试专家。 我们欢迎优秀的测试人加入DiggerPlus Team。 加入DiggerPlus,可以成为我们的认证Dper,认证Dper拥有DiggerPlus独一无二的专栏并得到个人展示。

===== DiggerPlus 官方读者群 =====
DiggerPlus官方读者群(一)

+ 关于本文作者

我也很想让世界变得更美好,可是上帝却不开放源代码。

的专栏 | 专栏作者 | 访问Kiven的主页

+ 已有2个评论

Copyright © 2014 DiggerPlus. 84 queries in 1.040 seconds.
使用合作网站账号快速登录,更多精彩等着您: 开源中国