为什么存储密码字符数组比字符串更合适?
个人觉得此话很有道理:任何与字符串相关的问题一定可以从字符串的属性里面的线索中找到。
为什么存储密码字符数组比字符串更合适?
1、因为字符串是不可变对象,如果作为普通文本存储密码,那么它会一直存在内存中直至被垃圾收集器回收。因为字符串从字符串池中取出的(如果池中有该字符串就直接从池中获取,否则new 一个出来,然后把它放入池中),这样有很大的机会长期保留在内存中,这样会引发安全问题。因为任何可以访问内存的人能以明码的方式把密码dump出来。另外你还应该始终以加密而不是普通的文本来表示密码。因为字符串是不可变,因此没有任何方法可以改变其内容,任何改变都将产生一个新的字符串,而如果使用char[],你就可以设置所有的元素为空或者为零(这里作者的意思是说,让认证完后该数组不再使用了,就可以用零或者null覆盖原来的密码,防止别人从内存中dump出来)。所以存储密码用字符数组可以明显的减轻密码被盗的危险。
2、Java官方本身也推荐字符数组,JpasswordField的方法getPassword()就是返回一个字符数组,而由于安全原因getText()方法是被废弃掉的,因为它返回一个纯文本字符串。跟随Java 团队的步伐吧,没有错。
3、字符串以普通文本打印在在log文件或控制台中也易引起危险,但是如果使用数组你不能打印数组的内容,而是它的内存地址。尽管这不是它的真正原因,但仍值得注意。
当然,字符数组也不见得会有多安全,还是得用密码加密代替普通文本比较好,并且一旦认证,尽快清除掉;