ฉันเห็นคำถามที่ถามวิธีการจัดเก็บรหัสผ่านผู้ใช้อย่างปลอดภัยสำหรับเว็บแอปพลิเคชัน (ใช้ RDBMS ฉันไม่ได้พูดถึง Facebook หรือ Twitter) คำตอบปกติคือ "ใส่รหัสผ่านแล้วแฮชด้วยอัลกอริทึมที่รัดกุมเช่น TDES หรือ SHA512"
คำถามของฉันคือ: ในฐานะผู้ใช้ RDBMS เหตุใดฉันจึงต้องกังวลด้วยรหัสผ่านที่เก็บปัญหาได้เนื่องจากเอ็นจิ้นส่วนใหญ่มีกลไกการพิสูจน์ตัวตนในตัว
ตัวอย่างเช่นหากผู้ใช้ X บางคนต้องการสร้างรหัสผ่านบัญชีผู้ใช้ Y ในเว็บแอปพลิเคชันของฉันวิธีการออกแบบสอบถามต่อไปนี้ไม่ถูกต้อง:
CREATE USER X WITH ENCRYPTED PASSWORD Y IN GROUP baseuser;
จากภายในแอปพลิเคชันของฉันผู้ใช้สามารถเปิดการเชื่อมต่อกับฐานข้อมูลโดยใช้ข้อมูลประจำตัวของเขาและฉันไม่ต้องกังวลกับการจัดการรหัสผ่านทั้งหมด
ฉันเห็นข้อดีหลายประการสำหรับวิธีนี้:
- หาก RDBMS ตัดสินใจว่าจำเป็นต้องเปลี่ยนอัลกอริทึมการเข้ารหัสฉันไม่จำเป็นต้องแตะสิ่งใดเลยเพียงเพื่อใช้การปรับปรุงความปลอดภัย
- มันง่ายสำหรับฉันในการจัดการการอนุญาตผู้ใช้ หากผู้ใช้ได้รับการเลื่อนตำแหน่งเป็นบทบาทของผู้ดูแลระบบฉันแค่ต้องเพิ่มผู้ใช้ในกลุ่มที่เกี่ยวข้อง
- SQL injections นั้นไม่มีความหมายสำหรับฉันจัดการการอนุญาตให้อนุญาตสิ่งที่ฉันต้องการอนุญาตให้ผู้ใช้แต่ละรายในฐานข้อมูล (ตัวอย่างเช่นในฟอรัมเช่น SO, เพิ่มการโพสต์ใหม่, ตอบกระทู้, แสดงความคิดเห็นและแก้ไข / ลบคำถามของเขาเอง / คำตอบ / ความคิดเห็น);
- บัญชีผู้ใช้ "ไม่ระบุชื่อ" สามารถใช้สำหรับการเชื่อมต่อกับแอปพลิเคชันของฉันโดยไม่ได้รับอนุญาต
- ผู้ใช้แต่ละคนเป็นเจ้าของข้อมูลที่เขาให้ไว้
แต่ในทุกคำถามที่ฉันเห็นในหัวข้อนี้ดูเหมือนจะมีฉันทามติทั่วไปว่านี่ไม่ใช่วิธีที่จะต้องทำ คำถามของฉันคือ: ทำไม
หมายเหตุ: จุดที่สามได้รับอนุญาตจากนโยบายใน PostgreSQL และนโยบายความปลอดภัยใน Microsoft SQL Server ฉันรู้ว่าแนวคิดเหล่านี้เป็นผู้มาใหม่แต่ทว่าตอนนี้มาถึงแล้วทำไมเทคนิคที่ฉันอธิบายไม่ได้กลายเป็นวิธีมาตรฐานในการจัดการบัญชีผู้ใช้