Cả String và Char[] array đều dùng để lưu trữ dữ liệu văn bản nhưng việc chọn cái này hơn cái kia khó khăn hơn. Có thể chúng ta lấy ý tưởng từ tính bất biến của String tại sao char[] array được ưu tiên hơn String để lưu trữ thông tin nhạy cảm như mật khẩu, SSN, v.v.
- Sử dụng plain string có cơ hội cao hơn vô tình in mật khẩu ra log hoặc các nơi không an toàn khác nơi char[] array ít bị tổn thương hơn.
- Vì String là immutable, không có phương thức nào cho phép thay đổi hoặc ghi đè nội dung của string. Tính năng này khiến đối tượng string không ổn định để lưu trữ thông tin bảo mật như mật khẩu, SSN, v.v. Chúng ta nên luôn lưu trữ thông tin bảo mật trong char[] array thay vì String.
- Vì String là immutable, nếu lưu mật khẩu dưới dạng plain text, nó sẽ có sẵn trong bộ nhớ cho đến khi garbage collector dọn dẹp. Vì string dùng String Constant Pool (SCP) để tái sử dụng, có khả năng khá lớn nó sẽ tồn tại trong bộ nhớ lâu dài. Bất kỳ ai có quyền truy cập memory dump đều dễ dàng tìm thấy mật khẩu dạng plain text, đó là lý do nên dùng mật khẩu mã hóa thay vì plain text.
- Nếu chú ý trong ứng dụng Java Swing, có phương thức của JPasswordField là getPassword() trả về char[] và phương thức deprecated getText() trả về mật khẩu dạng plain text. Vậy Java bản thân khuyên dùng phương thức getPassword().
- Một lý do khác để lưu mật khẩu trong char[] array, vì char[] có thể được sanitized, ví dụ sau khi dùng có thể ghi đè mật khẩu rõ bằng rác, trong khi String là immutable trong Java.
Ví dụ
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);
}
}Kết quả
String Password is: string_pass_word Character Password is: [C@6d06d69c