為什麼在 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
廣告