JavaRush /จาวาบล็อก /Random-TH /คำถาม & คำตอบ: เหตุใดจึงดีกว่าที่จะเก็บรหัสผ่านใน Java ไว...

คำถาม & คำตอบ: เหตุใดจึงดีกว่าที่จะเก็บรหัสผ่านใน Java ไว้ในอาร์เรย์อักขระแทนที่จะเป็นสตริง

เผยแพร่ในกลุ่ม
คุณอาจได้ยินคำถามดังกล่าวในการสัมภาษณ์ตำแหน่ง Java Junior แต่เพื่อนของฉันถูกถามเรื่องนี้ระหว่างการสัมภาษณ์ตำแหน่งหัวหน้าฝ่ายเทคนิค
คำถาม & คำตอบ: เหตุใดจึงดีกว่าที่จะเก็บรหัสผ่านใน Java ไว้ในอาร์เรย์อักขระแทนที่จะเป็นสตริง  - 1
สามารถใช้ ทั้ง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
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION