为什么在 Java 中使用 char[] 数组比 String 更安全(存储敏感数据)?
String 和 char[] 数组 都用于存储文本数据,但在两者之间进行选择却比较困难。也许我们可以从 String 的不可变性 中得到一些启示,了解为什么在存储敏感信息数据(如密码、社会安全号码等)时,char[] 数组 比 String 更受欢迎。
- 使用普通字符串更容易意外地将密码打印到日志或其他不安全的地方,而 char[] 数组 则不太容易受到攻击。
- 由于 String 是不可变的,因此没有定义允许我们更改或覆盖字符串内容的方法。此特性使得字符串对象不适合存储安全信息,例如密码、社会安全号码等。我们应该始终将安全信息存储在 char[] 数组中,而不是 String 中。
- 由于 String 是不可变的,如果我们将密码作为纯文本存储,它将保留在内存中,直到垃圾回收器将其清理。由于 String 使用字符串常量池 (SCP) 来重复使用字符串,因此它很有可能在内存中保留很长时间。由于任何拥有内存转储访问权限的人都可以轻松找到纯文本密码,因此这是另一个应该使用加密密码而不是纯文本的原因。
- 如果我们在 Java Swing 应用程序 中注意到,有一个 JPasswordField 的 getPassword() 方法 返回 char[],以及已弃用的 getText() 方法 返回纯文本密码。因此,Java 本身建议使用 getPassword() 方法。
- 将密码存储在 char[] 数组 中的另一个原因是,char[] 可以被清理,例如,在使用后,可以将清除的密码覆盖为垃圾,而 Java 中的 String 是不可变的。
示例
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
广告