คุณอาจได้ยินคำถามดังกล่าวในการสัมภาษณ์ตำแหน่ง Java Junior แต่เพื่อนของฉันถูกถามเรื่องนี้ระหว่างการสัมภาษณ์ตำแหน่งหัวหน้าฝ่ายเทคนิค
สามารถใช้ ทั้ง
String
, และอาร์เรย์อักขระเพื่อเก็บข้อมูลข้อความได้ แต่การเลือกอย่างมีสติสำหรับงานใดงานหนึ่งเป็นเรื่องยากหากคุณยังไม่พบสถานการณ์ที่คล้ายกัน อย่างไรก็ตาม ตามที่เพื่อนของฉันชี้ให้เห็น คำถามใดๆ ที่เกี่ยวข้องกับ
String
มักจะเกี่ยวข้องกับคุณสมบัติพิเศษของสตริงที่เรียกว่าความไม่เปลี่ยนรูป (
Immutable
) และเขาก็ใช้ประโยชน์จากสิ่งนี้ในการสัมภาษณ์ ดังนั้น เรามาดูเหตุผลสองสามข้อว่าทำไมคุณจึงควรใช้
char []
และไม่ใช้
String
เพื่อ จัดเก็บรหัสผ่านของคุณ
เหตุผลที่ 1 สตริงไม่เปลี่ยนรูป
เนื่องจากสตริงไม่เปลี่ยนรูปใน Java รหัสผ่านข้อความธรรมดาของคุณจะยังคงอยู่ในหน่วยความจำจนกว่าตัวรวบรวมขยะจะล้างมัน และเนื่องจาก
String
มี
String pool
การใช้ซ้ำจึงมีความเป็นไปได้ค่อนข้างสูงที่รหัสผ่านจะยังคงอยู่ในหน่วยความจำเป็นเวลานานซึ่งไม่ปลอดภัยเลย
Java String poolคือพูลหรือชุดของอ็อบเจ็กต์ (สตริง) ที่อยู่ในตำแหน่งพิเศษ - ฮีป String ใน Java เป็นหนึ่งในประเภทข้อมูลที่พบบ่อยที่สุด นี่ไม่ใช่ประเภทดั้งเดิม แต่เป็นอ็อบเจ็กต์ เนื่องจากเป็นประเภทที่ใช้ทรัพยากรมาก ดังนั้น ในการจัดเก็บสตริงที่มีอักขระสี่ตัว คุณต้องจัดสรรหน่วยความจำ 56 ไบต์ นี่คือสาเหตุว่าทำไมสตริงจึงถูกจัดเก็บไว้บนฮีปเช่นเดียวกับอ็อบเจ็กต์อื่นๆ |
ใครก็ตามที่สามารถเข้าถึงดัมพ์หน่วยความจำสามารถค้นหารหัสผ่านในรูปแบบข้อความธรรมดาได้ ซึ่งเป็นเหตุผลที่ดีที่จะใช้รหัสผ่านที่เข้ารหัสแทนข้อความธรรมดา เนื่องจากสตริงไม่เปลี่ยนรูป เนื้อหาจึงไม่สามารถเปลี่ยนแปลงได้ การเปลี่ยนแปลงใดๆ จะสร้างบรรทัดใหม่ แต่ในกรณีของ
char []
คุณสามารถแทนที่องค์ประกอบใดๆ ด้วยศูนย์หรืออักขระว่างได้ ดังนั้นการจัดเก็บรหัสผ่านไว้ในอาร์เรย์อักขระจึงช่วยลดความเสี่ยงของการสกัดกั้นรหัสผ่านได้อย่างชัดเจน
เหตุผลที่ 2. คำแนะนำของผู้เขียน
Java เอง (แน่นอนว่าผ่านผู้สร้าง) แนะนำให้ใช้วิธีการ
getPassword ()
จากคลาส
JPasswordField
ที่ส่งคืน
char []
. คุณยังสามารถลองใช้วิธีที่เลิกใช้แล้ว
getText ()
ได้ ทำไมไม่ทำตามคำแนะนำของผู้เขียนภาษาล่ะ?
เหตุผลที่ 3 พิมพ์
สำหรับประเภท
String
นั้น มีความเสี่ยงเสมอที่ข้อความที่เก็บไว้ในสตริงจะถูกพิมพ์ในไฟล์บันทึกหรือในคอนโซล ในเวลาเดียวกัน หากคุณใช้
Array
คุณจะไม่พิมพ์เนื้อหาของอาร์เรย์ แต่จะพิมพ์เฉพาะตำแหน่งในหน่วยความจำเท่านั้น แน่นอนว่านี่ไม่ใช่เหตุผลที่ร้ายแรงนัก แต่ก็ยังสมเหตุสมผลอยู่
String strPassword = "Unknown";
char [] charPassword = new char [] {'U', 'n', 'k', 'w', 'o', 'n'};
System.out.println ("String password:" + strPassword);
System.out.println ("char password:" + charPassword);
String password: Unknown
Character password: [C@110b053
แน่นอนว่าการใช้
char []
Java เพื่อจัดเก็บรหัสผ่านในตัวมันเองไม่ใช่ยาครอบจักรวาล คุณต้องดูแลความปลอดภัย เช่น ทำงานกับแฮชและการเข้ารหัสรหัสผ่าน แทนที่จะจัดเก็บเป็นข้อความธรรมดา และแน่นอน ลบออกจากหน่วยความจำทันทีหลังจากขั้นตอนการรับรองความถูกต้อง
ขึ้นอยู่กับวัสดุจาก Javarevisited
GO TO FULL VERSION