为什么在密码问题上char[]优先于String?

问题:

在Swing中,密码域(JPasswordField)用getPassword()函数(用来返回char[])取代getText()函数(返回字符串)。在工作中我得到类似的建议是不要用字符串去处理密码相关的问题,为什么涉及到密码问题时字符串会对安全构成威胁呢?

回答1

String在Java中是不可变对象,这就意味着一旦创建了一个字符串,如果另一个进程把尝试内存的数据导出(dump),在GC进行垃圾回收之前该字符串会一直保留在内存中,那么该进程就可以轻易的读取到该字符串。而对于数组,可以在该数组处理它之后再显示地擦掉数组中内容,可以以任何方式把数组内容覆盖掉,即使是GC触发前密码也不会出现在系统的任何地方。所以,这是从安全角度来选择的,但是即便是用char[]也只是降低被攻击的概率而已,还是会有一些特定的手法攻破数组处理的密码。

回答2

从另一方面来,若是普通的字符串,有时你会不经意间打印密码到日志中或者其他不安全的地方,而char[] 就没那么显而易见,而是它的内存地址。

参考一下这段代码

public class Demo {
	public static void main(String[] args) {
		Object pw = "Password";
		System.out.println("String: " + pw);

		pw = "Password".toCharArray();
		System.out.println("Array: " + pw);
	}
}

输出结果

String: Password
Array: [C@186d4c1

参考文档:

官方的文Java加密体系结构指南


你可能感兴趣的:(为什么在密码问题上char[]优先于String?)