为什么 Char[] 数组比 Java 中的 String 更安全(存储敏感数据)?

javaobject oriented programmingprogramming更新于 2024/7/27 0:10:00

StringChar[] 数组 都用于存储文本数据,但选择其中一个更困难。也许我们可以从  String的不变性中得到这样的理解:为什么char[] 数组比 String 更适合存储敏感信息数据,如密码SSN等。

  • 使用纯字符串更有可能将密码意外打印到日志或其他不安全的地方,而char[] 数组不太容易受到攻击
  • 由于String 是不可变的,因此没有定义允许我们更改或覆盖字符串内容的方法。此功能使字符串对象在存储安全信息(如密码SSN等)时不稳定。我们应该始终将安全信息存储在 char[] 数组中,而不是 String 中。
  • 由于 String 是不可变的,如果我们将密码存储为纯文本,它将一直存在于内存中,直到垃圾 收集器清理它。由于字符串使用 S字符串常量池 (SCP) 来实现字符串的可重用性,因此它很有可能会在内存中保留很长时间。由于任何有权访问内存转储的人都可以轻松找到纯文本中的密码,这是应该使用加密 密码而不是纯文本的另一个原因。
  • 如果我们注意到在Java Swing 应用程序中,有一个方法JPasswordField getPassword()返回char[] ,以及一个弃用的方法 getText(),该方法以纯文本形式返回密码。因此,java 本身建议使用获取密码()方法。
  • 将密码存储在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

相关文章