为什么 char 数组比 Java 中的 String 更适合存储密码?
-
由于字符串在 Java 中是
不可变的
,如果你将密码存储为纯文本
,它将在内存中可用,直到垃圾收集器清除它- 我们应该要
加密一下这个密码
,重新保存一个加密后的,但是字符串不可变的原因,就算改了,之前的密码依旧在内存中有一段时间存活
- 我们应该要
-
并且为了可重用性,会存在 String 在
字符串池
中, 它很可能会保留在内存中持续很长时间,从而构成安全威胁。- String 在字符串池会获得比我们想象的更加久,这对密码来说是有安全隐患的
-
由于字符串是不可变的,所以不能更改字符串的内容,因为任何更改都会产生新的字符串,而如果你使用
char[]
,你就可以将所有元素设置为空白或零。用完密码之后将char[]的内存改为空
,这样就算会在内存中存活一段时间,也是没关系的
-
因此,在字符数组中存储密码可以明显降低窃取密码的安全风险。
-
当然还有其他什么不太重要的原因,比如Java推荐我们不要用字符串用char[]保存密码
-
打印的时候字符串会直接打印出来等等