為什麼在 Java 中使用 char[] 陣列比 String 更安全(儲存敏感資料)?


Stringchar[] 陣列 都用於儲存文字資料,但在兩者之間進行選擇卻比較困難。也許我們可以從 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

更新於: 2020年2月6日

5K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告