以下是一些理由,使得在Java中使用字符数组比String更好:
例如存储密码:
1)由于Java中的字符串是不可变的,如果将密码存储为纯文本,则它会一直存在内存中,直到垃圾收集器清除它,并且由于字符串在字符串池中用于可重用性,因此它有很高的机会长时间留在内存中,这会带来安全威胁。
任何可以访问内存转储的人都可以找到明文密码,这是您应始终使用加密密码而不是纯文本的另一个原因。
由于字符串是不可变的,因此不能更改字符串的内容,因为任何更改都会产生新的字符串,而如果使用char[],则仍然可以将其所有元素设置为空或零。因此,将密码存储在字符数组中显然可以减轻窃取密码的安全风险。
2)Java本身推荐使用JPasswordField的getPassword()方法返回char[],而弃用getText()方法返回明文密码,原因是出于安全考虑。遵循Java团队的建议并遵守标准比违反标准更好。
3)如果使用String,则始终存在将明文文本打印到日志文件或控制台的风险,但如果使用Array,则不会打印数组内容,而是打印其内存位置。虽然这不是一个真正的原因,但仍然有道理。
对于这个简单的程序:
String strPassword="Unknown";
char[] charPassword= new char[]{'U','n','k','n','o','w','n'};
System.out.println("String password: " + strPassword);
System.out.println("Character password: " + charPassword);
输出:
String password: Unknown
Character password: [C@110b053
这就是为什么在Java中,字符数组比字符串更适合用于存储密码的全部内容。虽然使用char[]并不足以确保安全,你需要擦除内容来提高安全性。
希望这能有所帮助。