为什么存储密码字符数组比字符串更合适?

2018 年 4 月 13 日 ImportNew

(点击上方公众号,可快速关注)


来源:ImportNew - 刘志军


“为什么存储密码用字符数组比字符串更合适”这个问题是我的一个朋友在最近一次面试中提到的。那哥们应聘的是一个技术lead职位,有超过六年的工作经验。字符数组和字符串都可以用于存储文本数据,但是在选择具体哪一种时,如果你没有针对具体的情况是很难回答这个问题的。但是正如这哥们说的任何与字符串相关的问题一定可以从字符串的属性里面的线索中找到,比如不可变性。他就用这种方式去说服面试官的。这里我们就来探讨一些关于为什么你应该使用char[] 来存储密码而不是字符串。


1. 因为字符串是不可变对象,如果作为普通文本存储密码,那么它会一直存在内存中直至被垃圾收集器回收。因为字符串从字符串池中取出的(如果池中有该字符串就直接从池中获取,否则new 一个出来,然后把它放入池中),这样有很大的机会长期保留在内存中,这样会引发安全问题。因为任何可以访问内存的人能以明码的方式把密码dump出来。另外你还应该始终以加密而不是普通的文本来表示密码。因为字符串是不可变,因此没有任何方法可以改变其内容,任何改变都将产生一个新的字符串,而如果使用char[],你就可以设置所有的元素为空或者为零(这里作者的意思是说,让认证完后该数组不再使用了,就可以用零或者null覆盖原来的密码,防止别人从内存中dump出来)。所以存储密码用字符数组可以明显的减轻密码被盗的危险。


2. Java官方本身也推荐字符数组,JpasswordField的方法getPassword()就是返回一个字符数组,而由于安全原因getText()方法是被废弃掉的,因为它返回一个纯文本字符串。跟随Java 团队的步伐吧,没有错。


3. 字符串以普通文本打印在在log文件或控制台中也易引起危险,但是如果使用数组你不能打印数组的内容,而是它的内存地址。尽管这不是它的真正原因,但仍值得注意。


String strPassword="Unknown";

char[] charPassword= new char[]{'U','n','k','w','o','n'};

System.out.println("String password: " + strPassword);

System.out.println("Character password: " + charPassword);

 

String password: Unknown

Character password: [C@110b053


以上所有就是为什么字符数组比字符串保存密码要好的原因,尽管使用char[]还不足以安全。我同样建议你用hash或者密码加密代替普通文本,而且一旦认证完成尽可能快的把他清除掉。


看完本文有收获?请转发分享给更多人

关注「ImportNew」,提升Java技能

登录查看更多
0

相关内容

还在修改博士论文?这份《博士论文写作技巧》为你指南
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
160+阅读 · 2020年5月14日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
【新书】Python中的经典计算机科学问题,224页PDF
专知会员服务
51+阅读 · 2019年12月31日
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
PC微信逆向:两种姿势教你解密数据库文件
黑客技术与网络安全
16+阅读 · 2019年8月30日
已删除
AI掘金志
7+阅读 · 2019年7月8日
Kali Linux 渗透测试:密码攻击
计算机与网络安全
15+阅读 · 2019年5月13日
Python用于NLP :处理文本和PDF文件
Python程序员
4+阅读 · 2019年3月27日
分词那些事儿
AINLP
6+阅读 · 2019年3月26日
为什么分布式一定要有消息队列?
互联网架构师
4+阅读 · 2018年7月5日
为什么你应该学 Python ?
计算机与网络安全
4+阅读 · 2018年3月24日
tensorflow LSTM + CTC实现端到端OCR
数据挖掘入门与实战
8+阅读 · 2017年11月15日
Arxiv
5+阅读 · 2018年5月5日
Arxiv
4+阅读 · 2018年4月29日
Arxiv
5+阅读 · 2018年3月6日
Arxiv
3+阅读 · 2017年10月1日
VIP会员
相关VIP内容
相关资讯
在K8S上运行Kafka合适吗?会遇到哪些陷阱?
DBAplus社群
9+阅读 · 2019年9月4日
PC微信逆向:两种姿势教你解密数据库文件
黑客技术与网络安全
16+阅读 · 2019年8月30日
已删除
AI掘金志
7+阅读 · 2019年7月8日
Kali Linux 渗透测试:密码攻击
计算机与网络安全
15+阅读 · 2019年5月13日
Python用于NLP :处理文本和PDF文件
Python程序员
4+阅读 · 2019年3月27日
分词那些事儿
AINLP
6+阅读 · 2019年3月26日
为什么分布式一定要有消息队列?
互联网架构师
4+阅读 · 2018年7月5日
为什么你应该学 Python ?
计算机与网络安全
4+阅读 · 2018年3月24日
tensorflow LSTM + CTC实现端到端OCR
数据挖掘入门与实战
8+阅读 · 2017年11月15日
相关论文
Top
微信扫码咨询专知VIP会员