คุณไม่ควรหลบหนีตัดแต่งหรือใช้กลไกการล้างข้อมูลอื่น ๆ ในรหัสผ่านที่คุณจะแฮชด้วย PHP password_hash()
ด้วยเหตุผลหลายประการซึ่งสาเหตุใหญ่ที่สุดเพียงข้อเดียวเนื่องจากการล้างรหัสผ่านเพิ่มเติมต้องใช้รหัสเพิ่มเติมที่ไม่จำเป็น
คุณจะโต้แย้ง (และคุณจะเห็นในทุกโพสต์ที่ยอมรับข้อมูลผู้ใช้สำหรับการใช้งานในระบบของคุณ) ว่าเราควรล้างข้อมูลผู้ใช้ทั้งหมดและคุณจะถูกต้องสำหรับข้อมูลอื่น ๆ ที่เรายอมรับจากผู้ใช้ของเรา รหัสผ่านแตกต่างกัน รหัสผ่านที่แฮชไม่สามารถนำเสนอภัยคุกคามการแทรก SQL ได้เนื่องจากสตริงถูกเปลี่ยนเป็นแฮชก่อนจัดเก็บในฐานข้อมูล
การแฮชรหัสผ่านเป็นการทำให้รหัสผ่านปลอดภัยในการจัดเก็บในฐานข้อมูลของคุณ ฟังก์ชันแฮชไม่ได้ให้ความหมายพิเศษกับไบต์ใด ๆ ดังนั้นจึงไม่จำเป็นต้องมีการล้างข้อมูลอินพุตเพื่อเหตุผลด้านความปลอดภัย
หากคุณปฏิบัติตามมนต์ในการอนุญาตให้ผู้ใช้ใช้รหัสผ่าน / วลีที่พวกเขาต้องการและคุณไม่ จำกัด รหัสผ่านการอนุญาตให้มีความยาวช่องว่างจำนวนเท่าใดก็ได้และการแฮชอักขระพิเศษใด ๆ จะทำให้รหัสผ่าน / ข้อความรหัสผ่านปลอดภัยไม่ว่าจะมีอะไรอยู่ภายในก็ตาม รหัสผ่าน. ณ ตอนนี้แฮชที่พบบ่อยที่สุด (ค่าเริ่มต้น) PASSWORD_BCRYPT
เปลี่ยนรหัสผ่านเป็นสตริงกว้าง 60 อักขระที่มีเกลือแบบสุ่มพร้อมกับข้อมูลรหัสผ่านที่แฮชและค่าใช้จ่าย (ต้นทุนอัลกอริทึมในการสร้างแฮช):
PASSWORD_BCRYPT ใช้เพื่อสร้างแฮชรหัสผ่านใหม่โดยใช้อัลกอริทึม CRYPT_BLOWFISH สิ่งนี้จะส่งผลให้แฮชใช้รูปแบบการเข้ารหัส "$ 2y $" ซึ่งกว้าง 60 อักขระเสมอ
ต้องการพื้นที่สำหรับการจัดเก็บกัญชาอาจมีการเปลี่ยนแปลงเป็นวิธีการที่แตกต่างกันคร่ำเครียดจะมีการเพิ่มฟังก์ชั่นจึงเป็นสิ่งที่ดีกว่าเสมอไปมีขนาดใหญ่ขึ้นอยู่กับชนิดคอลัมน์สำหรับกัญชาที่เก็บไว้เช่นหรือVARCHAR(255)
TEXT
คุณสามารถใช้แบบสอบถาม SQL ที่สมบูรณ์เป็นรหัสผ่านของคุณและจะถูกแฮชทำให้ไม่สามารถดำเนินการได้โดยเอ็นจิ้น SQL เช่น
SELECT * FROM `users`;
สามารถแฮชได้ $2y$10$1tOKcWUWBW5gBka04tGMO.BH7gs/qjAHZsC5wyG0zmI2C.KgaqU5G
มาดูกันว่าวิธีการฆ่าเชื้อที่แตกต่างกันมีผลต่อรหัสผ่านอย่างไร -
รหัสผ่านคือI'm a "dessert topping" & a <floor wax>!
(มี 5 ช่องว่างที่ส่วนท้ายของรหัสผ่านซึ่งไม่แสดงที่นี่)
เมื่อเราใช้วิธีการตัดแต่งต่อไปนี้เราจะได้ผลลัพธ์ที่แตกต่างกันออกไป:
var_dump(trim($_POST['upassword']))
var_dump(htmlentities($_POST['upassword']))
var_dump(htmlspecialchars($_POST['upassword']))
var_dump(addslashes($_POST['upassword']))
var_dump(strip_tags($_POST['upassword']))
ผล:
string(40) "I'm a "dessert topping" & a <floor wax>!"
string(65) "I'm a "dessert topping" & a <floor wax>! "
string(65) "I'm a "dessert topping" & a <floor wax>! "
string(48) "I\'m a \"dessert topping\" & a <floor wax>! "
string(34) "I'm a "dessert topping" & a ! "
เกิดอะไรขึ้นเมื่อเราส่งเหล่านี้เพื่อpassword_hash()
? พวกเขาทั้งหมดได้รับการแฮชเช่นเดียวกับข้อความค้นหาข้างต้น ปัญหาเกิดขึ้นเมื่อคุณพยายามยืนยันรหัสผ่าน ถ้าเราจ้างหนึ่งหรือมากกว่าของวิธีการเหล่านี้เราต้อง password_verify()
re-จ้างพวกเขาก่อนที่จะเปรียบเทียบกับ สิ่งต่อไปนี้จะล้มเหลว:
password_verify($_POST['upassword'], $hashed_password); // where $hashed_password comes from a database query
คุณจะต้องเรียกใช้รหัสผ่านที่โพสต์ผ่านวิธีการชำระล้างที่คุณเลือกก่อนที่จะใช้ผลของการตรวจสอบรหัสผ่านนั้น เป็นชุดขั้นตอนที่ไม่จำเป็นและจะทำให้การแฮชไม่ดีขึ้น
ใช้ PHP เวอร์ชันน้อยกว่า 5.5? คุณสามารถใช้แพคความเข้ากันpassword_hash()
คุณไม่ควรใช้แฮชรหัสผ่าน MD5จริงๆ