为什么在Java中Char []数组比String更安全(存储敏感数据)?
两个字符串和字符[]数组被用于存储文本数据但选择一个在另一个上是比较困难的。也许我们可以从String的 不变性中 得到想法,为什么在存储敏感信息数据(例如password,SSN 等)时,char[]数组比String更为可取。
使用纯字符串是意外打印密码日志或一些其他不安全的地方可能性要高得多的char[]数组是不太容易。
由于String是不可变的,因此没有定义允许我们更改或覆盖字符串内容的方法。此功能使字符串对象不稳定,无法存储安全信息,例如密码,SSN 等。我们应始终将安全信息存储在char[]数组中,而不是String中。
由于如果我们将密码存储为纯文本,则String是不可变的,因此它将在内存中可用,直到 垃圾回收器将其清除为止。由于串用小号特林常量池(SCP),用于字符串的可重用性,就会有一个漂亮的机会,它会留在记忆持续时间很长。由于任何有权访问内存转储的人都可以轻松地以纯文本形式找到密码,因此另一个原因是,应使用加密密码而不是纯文本。
如果我们在JavaSwing应用程序中注意到,则有一个JPasswordFieldgetPassword()方法返回char[] 和不推荐使用的方法 getText()返回纯文本密码。因此,java本身建议使用getpassword()方法。
将密码存储在char[]数组中的另一个原因是,可以对char[]进行清理,例如,使用后可以用垃圾覆盖明码,而String在Java中是不可变的。
示例
public class SecureInfoData { public static void main(String args[]) { String pwd = "string_pass_word"; System.out.println("String Password is: " + pwd); char charPwd[] = "char_pass_word".toCharArray(); System.out.println("Character Password is: " + charPwd); } }
输出结果
String Password is: string_pass_word Character Password is: [C@6d06d69c