Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ทำไม Char[] array จึงปลอดภัยกว่า String สำหรับเก็บข้อมูลความลับใน Java?

ทั้ง 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