ทั้ง String และ Char[] array ใช้เก็บข้อมูลข้อความ แต่อาจจะยากที่จะเลือกว่าอันไหนดีกว่า อาจจะเข้าใจได้จาก immutability ของ String ว่าทำไม char[] array ถูกนิยมมากกว่า String สำหรับเก็บข้อมูลความลับ เช่น password, SSN ฯลฯ
- การใช้ plain string มีโอกาสสูงกว่าที่จะพิมพ์ password ไปยัง logs หรือที่ไม่ปลอดภัยอื่นๆ โดยไม่ได้ตั้งใจ ในขณะที่ char[] array รุกรานน้อยกว่า (less vulnerable)
- เนื่องจาก String เป็น immutable ไม่มีเมธอดไหนที่อนุญาตให้เปลี่ยนหรือเขียนทับเนื้อหาของ string คุณสมบัตินี้ทำให้ string objects ไม่คงที่ (unstable) สำหรับเก็บข้อมูลความปลอดภัย เช่น passwords, SSN ฯลฯ เราควรเก็บข้อมูลความปลอดภัยใน char[] array แทน String
- เนื่องจาก String เป็น immutable หากเก็บ password เป็น plain text จะอยู่ในหน่วยความจำจนกว่า garbage collector จะทำความสะอาด เนื่องจาก string ใช้ String Constant Pool (SCP) สำหรับ re-usability มีโอกาสค่อนข้างสูงที่จะคงอยู่ในหน่วยความจำนาน ทุกคนที่เข้าถึง memory dump สามารถหา password ใน plain text ได้ง่าย นั่นเป็นอีกเหตุผลว่าควรใช้ encrypt password แทน plain text
- หากสังเกตใน Java Swing applications มีเมธอดของ JPasswordField คือ getPassword() ที่คืนค่า char[] และเมธอดที่ deprecated คือ getText() ที่คืนค่า password เป็น plain text ดังนั้น Java เองแนะนำให้ใช้ getPassword() method
- อีกเหตุผลสำหรับการเก็บ password ใน char[] array คือ char[] สามารถ sanitized ได้ เช่น หลังใช้งานสามารถเขียนทับ password ที่ชัดเจนด้วยขยะ (junk) ในขณะที่ String เป็น immutable ใน 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