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

เหตุใดอาร์เรย์ Char [] จึงปลอดภัย (เก็บข้อมูลที่ละเอียดอ่อน) มากกว่า String ใน Java


ทั้ง สตริง และ อาร์เรย์[] อาร์เรย์ ใช้เพื่อเก็บข้อมูลที่เป็นข้อความ แต่การเลือกอย่างใดอย่างหนึ่งจะยากกว่า บางทีเราอาจได้แนวคิดจากการไม่เปลี่ยนรูปของ สตริง ทำไม อาร์เรย์[] อาร์เรย์ เป็นที่ต้องการมากกว่า String สำหรับการจัดเก็บข้อมูลที่ละเอียดอ่อน เช่น รหัสผ่าน , SSN, เป็นต้น

  • การใช้สตริงธรรมดามีโอกาสสูงที่จะพิมพ์รหัสผ่านไปยังบันทึกโดยไม่ได้ตั้งใจหรือในที่ที่ไม่ปลอดภัยอื่นๆ ที่อาร์เรย์ ถ่าน[] เสี่ยงน้อยกว่า .
  • เนื่องจาก สตริงไม่เปลี่ยนรูป ไม่มีวิธีการที่กำหนดไว้ที่ช่วยให้เราสามารถเปลี่ยนแปลงหรือเขียนทับเนื้อหาของสตริงได้ คุณลักษณะนี้ทำให้อ็อบเจ็กต์สตริงไม่เสถียรสำหรับการจัดเก็บข้อมูลที่ปลอดภัย เช่น รหัสผ่าน , SSN, ฯลฯ เราควรเก็บข้อมูลที่ปลอดภัยไว้ในอาร์เรย์ char[] แทนสตริงเสมอ
  • เนื่องจาก String จะไม่เปลี่ยนรูปหากเราเก็บรหัสผ่านเป็นข้อความธรรมดา รหัสผ่านจะอยู่ในหน่วยความจำจนถึง ขยะ นักสะสม ทำความสะอาด เนื่องจากสตริงใช้ S รวมค่าคงที่พูล (SCP) สำหรับการนำสตริงกลับมาใช้ใหม่ได้มีโอกาสค่อนข้างที่จะอยู่ในหน่วยความจำเป็นเวลานาน เนื่องจากใครก็ตามที่สามารถเข้าถึงการถ่ายโอนข้อมูลหน่วยความจำสามารถค้นหารหัสผ่านเป็นข้อความธรรมดาได้อย่างง่ายดาย ซึ่งเป็นอีกสาเหตุหนึ่งที่ควรใช้ เข้ารหัส รหัสผ่าน มากกว่าข้อความธรรมดา
  • หากเราสังเกตเห็นใน แอปพลิเคชัน Java Swing มีวิธี JPasswordField getPassword() ซึ่งส่งคืน ถ่าน[] และวิธีที่เลิกใช้แล้ว getText() ซึ่งส่งคืนรหัสผ่านเป็นข้อความธรรมดา ดังนั้นจาวาเองจึงแนะนำให้ใช้รับรหัสผ่าน() วิธีการ
  • อีกเหตุผลหนึ่งในการจัดเก็บรหัสผ่านในอาร์เรย์ char[] เนื่องจาก char[] สามารถฆ่าเชื้อได้ ตัวอย่างเช่น หลังการใช้งานสามารถแทนที่รหัสผ่านที่ชัดเจนด้วยขยะ ในขณะที่ String จะไม่เปลี่ยนรูปใน Java

ตัวอย่าง

<ก่อน> SecureInfoData คลาสสาธารณะ { โมฆะคงสาธารณะหลัก (สตริง args []) { สตริง pwd ="string_pass_word"; System.out.println("รหัสผ่านสตริงคือ:" + pwd); ถ่าน charPwd[] ="char_pass_word".toCharArray(); System.out.println("รหัสผ่านของอักขระคือ:" + charPwd); }}

ผลลัพธ์

รหัสผ่านสำหรับสตริงคือ:string_pass_wordCharacter รหัสผ่านคือ:[C@6d06d69c