ทั้ง สตริง และ อาร์เรย์[] อาร์เรย์ ใช้เพื่อเก็บข้อมูลที่เป็นข้อความ แต่การเลือกอย่างใดอย่างหนึ่งจะยากกว่า บางทีเราอาจได้แนวคิดจากการไม่เปลี่ยนรูปของ สตริง ทำไม อาร์เรย์[] อาร์เรย์ เป็นที่ต้องการมากกว่า 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