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

版权声明:作者:N3verL4nd 出处: https://blog.csdn.net/lgh1992314/article/details/80086995

记得这是 《java核心技术》这本书中的一句话,当时读到时也是各种疑惑。
String 的存在在很大程度上就是取代字符数组char[] ,为何又推荐密码使用字符数组保存?


我们知道,字符数组和字符串都可以用于存储文本数据。

任何与字符串相关的问题一定可以从字符串的属性里面找到线索,比如不可变性。

对于String password1 = "1q2w3e";,String实例(本体,内容为”1q2w3e”)保存在 JVM 堆中,而在字符串常量池中驻留其引用(和password1 一致)。

而在 JDK1.7 以后,永久带(PermGen)移除,方法区的实现采用native memory。字符串常量池不再保存在永久带。所以String.intern 不会再出现java.lang.OutOfMemoryError: PermGen space

这部分的详细介绍见:
Java中几种常量池的区分
Java String 源码分析
String.intern 解析


因为字符串是不可变对象,如果作为普通文本存储密码,那么它会一直存在内存中(堆)直至被垃圾收集器回收。任何可以访问内存的人都能以明码的方式把密码dump出来。


测试:
获取heap dump文件:
jmap -dump:format=b,file=info.txt 8220

jhat -port 5000 info.txt
jhat 是用来分析 java 堆的命令,可以将堆中的对象以 html 的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。

这里写图片描述

使用 HSDB 读取:
HSDB

扫描二维码关注公众号,回复: 3512701 查看本文章

而如果使用char[],你就可以设置所有的元素为”或者置引用为null(这里作者的意思是说,密码认证完后该数组不再使用了,防止别人从内存中dump出来)。所以存储密码用字符数组可以明显的减轻密码被盗的危险。

猜你喜欢

转载自blog.csdn.net/lgh1992314/article/details/80086995