为什么在密码问题上char[]优先于String?
2016-01-13 02:33
239 查看
【转自】http://www.importnew.com/10281.html
在Swing中,密码域(JPasswordField)用
String在Java中是不可变对象,这就意味着一旦创建了一个字符串,如果另一个进程把尝试内存的数据导出(dump),在GC进行垃圾回收之前该字符串会一直保留在内存中,那么该进程就可以轻易的读取到该字符串。
而对于数组,可以在该数组处理它之后再显示地擦掉数组中内容,可以以任何方式把数组内容覆盖掉,即使是GC触发前密码也不会出现在系统的任何地方。
所以,这是从安全角度来选择的,但是即便是用
从另一方面来,若是普通的字符串,有时你会不经意间打印密码到日志中或者其他不安全的地方,而char
参考一下这段代码:
输出结果:
引用官方的文档,Java加密体系结构指南说到char[]
vs String。在对象
字符数组(
尽管使用
问题
在Swing中,密码域(JPasswordField)用getPassword()函数(用来返回
char[])取代
getText()函数(返回字符串)。在工作中我得到类似的建议是不要用字符串去处理密码相关的问题,为什么涉及到密码问题时字符串会对安全构成威胁呢?(译注:这是提问者在Stackoverflow提了问题,他觉得用char[]处理密码并没有String方便,但为什么还要推荐使用char[]处理呢?下面是几个比较精彩的回答)。
回答1
String在Java中是不可变对象,这就意味着一旦创建了一个字符串,如果另一个进程把尝试内存的数据导出(dump),在GC进行垃圾回收之前该字符串会一直保留在内存中,那么该进程就可以轻易的读取到该字符串。而对于数组,可以在该数组处理它之后再显示地擦掉数组中内容,可以以任何方式把数组内容覆盖掉,即使是GC触发前密码也不会出现在系统的任何地方。
所以,这是从安全角度来选择的,但是即便是用
char[]也只是降低被攻击的概率而已,还是会有一些特定的手法攻破数组处理的密码。
回答2
从另一方面来,若是普通的字符串,有时你会不经意间打印密码到日志中或者其他不安全的地方,而char[] 就没那么显而易见。
参考一下这段代码:
回答3
引用官方的文档,Java加密体系结构指南说到char[]vs String。在对象
java.lang.String中收集和存储密码看似符合逻辑,但是字符串对象是不可变的,没有任何方法可以改变(重写)或清空内容。这一特性使得字符串对象不适合存储安全敏感信息,比如用户密码。你应当使用一个字符数组来代替,以便收集和存储安全敏感的信息。安全编码指南4.0也提到了类似的问题。
回答4
字符数组(char[])在使用之后里面的元素可以被清除,字符串并不如此。如果有人能以某种方式看到内存映像,如果字符串被使用了,它们可以以纯文本方式看到密码。但如果是
char[], 看到的是清除后的数据(用0替换的数据),这种方式是安全的。
最后的思考
尽管使用char[]并不能保证足够安全,但我也建议使用hash’d或者加密的密码来代替普通的文本字符串密码,而且使用完后立即清除。
相关文章推荐
- Linux 下磁盘分区和创建文件系统(基于Ubuntu平台)
- Hard Link vs Soft Link
- 2016/01/13开始学习git:分支管理:创建、合并、删除分支
- 2016/01/13开始学习git:远程仓库
- Swift开发IOS-UIWebView
- js类库 一些常用方法记录
- ecshop 微信通的 连接。让他自动获得openid 后跳转
- ILog调试日志
- Ubuntu虚拟机编译Android6.0总结
- uwp开发图片上传插件demo
- LeetCode Count of Smaller Numbers After Self
- ecshop 购物车 下单 提交到订单表的代码
- 重拾编程之路--Linked List Cycle
- LeetCode Super Ugly Number
- git有用的地址
- 宽度优先搜索图
- (译)如何优化cocos2d程序的内存使用和程序大小:第二部分(完)
- (译)如何优化cocos2d程序的内存使用和程序大小:第一部分
- a标签的onclick事件和href属性使用
- 2016/01/13开始学习git:删除文件