การเติม Salt ในการลงทะเบียน
ดังนั้น คุณทราบแล้วว่าการแฮชด้วย
md5 เป็นกระบวนการที่ไม่สามารถย้อนกลับได้ และแฮกเกอร์
ที่ได้แฮชไป จะไม่สามารถได้
รหัสผ่านจากแฮชนั้นกลับมา
อันที่จริงข้อความนี้ไม่ค่อยถูกต้องนัก - ในปัจจุบัน แฮกเกอร์ร้ายได้รวบรวม ไลบรารีของแฮชจากรหัสผ่านที่นิยมและไม่ค่อยนิยม และใครก็ตามสามารถไขรหัสผ่านได้ง่ายๆ แค่ค้นหาแฮชนั้นในกูเกิล
เรากำลังพูดถึงรหัสผ่านที่ค่อนข้างง่ายและเป็นที่นิยม
ลองค้นหาในกูเกิลดู เช่น แฮช 827ccb0eea8a706c4c34a16891f84e7b
และคุณจะเห็นในผลการค้นหากูเกิลทันที ว่ามันคือ
รหัสผ่าน '12345'
แฮชของรหัสผ่านที่ซับซ้อนพอจะไม่สามารถไขได้ด้วยวิธีนี้ (ลองดู)
คุณอาจถามว่า แล้วปัญหามันอยู่ที่ไหน - ให้เราทุกคนลงทะเบียนด้วย รหัสผ่านที่ซับซ้อนก็สิ้นเรื่อง แต่มันมีปัญหาอยู่ - ผู้ใช้ส่วนใหญ่ไม่ค่อยคิด เรื่องความปลอดภัยของข้อมูลตัวเองและอาจใส่ รหัสผ่านที่ค่อนข้างง่าย
เราสามารถบังคับให้คิด
รหัสผ่านที่ยาวขึ้นตอนลงทะเบียน โดยกำหนด
จำนวนตัวอักษรขั้นต่ำเป็น 6
หรือ 8 ตัว อย่างไรก็ตาม มันก็ยังจะมี
รหัสผ่านแบบ '123456' หรือ '12345678' อยู่ดี
แน่นอน เราสามารถออกแบบอัลกอริทึม การตรวจสอบความซับซ้อนของรหัสผ่านที่ฉลาดขึ้นได้ แต่มีอีก ทางออกหนึ่ง
สาระสำคัญของวิธีนี้คือ: ต้อง เติมเกลือ ให้กับรหัสผ่าน เกลือ (Salt) คือสตริงสุ่มพิเศษ ซึ่งจะถูกเติมเข้ากับรหัสผ่านตอนลงทะเบียน และแฮชจะถูกคำนวณไม่ใช่จากรหัสผ่านธรรมดา แต่จากสตริง เกลือ+รหัสผ่าน นั่น คือจากรหัสผ่านที่เติมเกลือแล้ว
นั่นคือตอนลงทะเบียนคุณจะทำ อะไรประมาณนี้:
<?php
$salt = '1sJg3hfdf'; // เกลือ - สตริงสุ่มที่ซับซ้อน
$password = md5($salt . $_POST['password']); // แปลงรหัสผ่านเป็นแฮชที่เติมเกลือแล้ว
?>
โดยเกลือจะต้องแตกต่างกันสำหรับผู้ใช้แต่ละคน และต้องถูกสร้างแบบสุ่ม ในขณะลงทะเบียน
นี่คือฟังก์ชันสำเร็จรูปที่ทำหน้าที่นี้:
<?php
function generateSalt()
{
$salt = '';
$saltLength = 8; // ความยาวของเกลือ
for($i = 0; $i < $saltLength; $i++) {
$salt .= chr(mt_rand(33, 126)); // อักขระจากตาราง ASCII
}
return $salt;
}
?>
ด้วยฟังก์ชันนี้ เราสามารถเขียนโค้ดของเรา ใหม่ได้ดังนี้:
<?php
$salt = generateSalt(); // เกลือ
$password = md5($salt . $_POST['password']); // รหัสผ่านที่เติมเกลือแล้ว
?>
ขอย้ำอีกครั้งว่า การเปลี่ยนแปลงเหล่านี้อยู่ที่ ขั้นตอนลงทะเบียน - ในฐานข้อมูลเราเก็บไม่ใช่แค่แฮช ของรหัสผ่านธรรมดา แต่เป็นแฮชของรหัสผ่านที่เติมเกลือแล้ว
ยังไม่หมดแค่นั้น: ในตารางผู้ใช้ นอกจาก
ฟิลด์ login และ password ต้อง
สร้างฟิลด์ salt เพิ่มขึ้นมาอีก โดยในฟิลด์นี้
เราจะเก็บเกลือของแต่ละผู้ใช้
จงนำระบบลงทะเบียนด้วยรหัสผ่านที่เติมเกลือ ตามที่อธิบายไว้ข้างต้นไปใช้