ฉันมีระบบการเข้าสู่ระบบขั้นพื้นฐานที่ตรวจสอบสิทธิ์ผู้ใช้โดยใช้ตารางผู้ใช้ในฐานข้อมูล mysql ด้วย php
ใครช่วยอธิบายหน่อยว่ารหัสผ่านแฮชมีไว้เพื่ออะไร วิธีใช้ php และสิ่งที่เก็บไว้ในฐานข้อมูลจริงๆ
ขอบคุณ
ฉันมีระบบการเข้าสู่ระบบขั้นพื้นฐานที่ตรวจสอบสิทธิ์ผู้ใช้โดยใช้ตารางผู้ใช้ในฐานข้อมูล mysql ด้วย php
ใครช่วยอธิบายหน่อยว่ารหัสผ่านแฮชมีไว้เพื่ออะไร วิธีใช้ php และสิ่งที่เก็บไว้ในฐานข้อมูลจริงๆ
ขอบคุณ
ใครสามารถอธิบายได้ว่าจุดของการแฮชรหัสผ่านคืออะไร
จุดของการแฮชรหัสผ่านมีไว้เพื่อความปลอดภัย หากแทรกเป็นข้อความธรรมดา ใครก็ตามที่เข้าไปในฐานข้อมูลของคุณจะมีรหัสผ่านผู้ใช้ทั้งหมดของคุณ ปัญหาใหญ่อีกประการหนึ่งที่เกิดจากสิ่งนี้ก็คือ มันมีแนวโน้มว่าจะเป็นอันตรายต่อผู้ใช้ทุกที่ ไม่ใช่แค่ไซต์ของคุณ เนื่องจากคนส่วนใหญ่มักจะใช้รหัสผ่านเดียวกันทุกที่
จะทำอย่างไรกับ php และสิ่งที่เก็บไว้ในฐานข้อมูลจริงๆ
หากต้องการใช้ใน PHP คุณเพียงใช้สตริงในตัวอย่างนี้ $password = 'password';
และใช้คำสั่ง sha1();
สิ่งนี้จะคืนค่าบางอย่างเช่น d0be2dc421be4fcd0172e5afceea3970e2f3d940
นอกจากนี้ แนวทางปฏิบัติที่ดีคือ 'เกลือ' รหัสผ่านด้วยสคริปต์ php ของคุณ เพื่อให้สคริปต์เข้าสู่ระบบสคริปต์ PHP จำเป็นในการเข้าสู่ระบบได้สำเร็จ ตัวอย่าง:
<?php
$salt1 = '2348SDasdf!^*__';
$salt2 = '_a35j@*#(lsdf_';
$password = sha1($salt1.$_POST['password'].$salt2); // d0be2dc421be4fcd0172e5afceea3970e2f3d940
?>
จากนั้นใส่ $password ลงในฐานข้อมูลของคุณ เมื่อเข้าสู่ระบบ คุณจะต้องเติมรหัสผ่านที่กำหนดให้เรียกใช้ผ่าน sha1 เพื่อให้ตรงกับรหัสผ่านในฐานข้อมูล คุณแทรกลงในฐานข้อมูลเช่นเดียวกับสตริงอื่นๆ เพียงตรวจสอบให้แน่ใจว่าคุณมีความยาวเพียงพอสำหรับคอลัมน์ที่คุณพยายามแทรกด้วย
สมมติว่ามีคนบุกรุกระบบของคุณ (หรือพบช่องโหว่ในการสืบค้น SQL ของคุณ) แล้วคุณคงไม่อยากให้พวกเขารู้รหัสผ่านทั้งหมด
ดังนั้นคุณจึงแฮชก่อนที่จะจัดเก็บ ดังนั้นคุณสามารถตรวจสอบได้ว่ารหัสผ่านนั้นใช้ได้หรือไม่ แต่ไม่สามารถอนุมานรหัสผ่านจากแฮชได้
เว้นแต่คุณจะใช้แฮชที่อ่อนแอ หากคุณเพียง sha1($password)
คุณจะพบว่าการใส่แฮชของรหัสผ่านที่ใช้บ่อยลงใน Google จะให้รหัสผ่านภายในเวลาไม่ถึง 0.1 วินาที* (แต่ไม่เช่นนั้น คุณจะพบตารางสีรุ้งสำหรับแฮชทุกประเภท)
ดังนั้นคุณต้องการเพิ่ม "เกลือ" นั่นหมายความว่าคุณสร้างค่าขยะ:
$salt = rand().rand().rand();
แล้วเก็บ
$hash = $salt."-".sha1($salt.$password);
ในการตรวจสอบ คุณจะรู้เกลือและคุณสามารถตรวจสอบได้ว่ารหัสผ่านนั้นถูกต้องหรือไม่ แต่การรู้แฮชและเกลือทำให้การกู้คืนรหัสผ่านยังทำได้ยาก (เว้นแต่คุณจะมีโต๊ะสายรุ้งซึ่งมีเกลืออยู่ด้วย)
* สิ่งนี้ต้องการคำอธิบายบางอย่าง: ครั้งหนึ่งฉันเคยใช้ตารางผู้ใช้ขนาดใหญ่และพบว่ามีแฮชปรากฏขึ้นหลายครั้ง ฉันค้นหารายการที่เกิดขึ้นมากที่สุดใน Google และมันกลับเป็น computer
rand()
ไม่ปลอดภัยด้วยการเข้ารหัส เกลือควรเป็นคอลัมน์แยกต่างหาก นั่นเป็นการออกแบบฐานข้อมูลที่ไม่ดี
- person rook; 25.08.2010
7236817
เขาจะต้องย้อนกลับแฮชของ 7236817your_password
อย่างมีประสิทธิภาพ ซึ่งจะมีโอกาสน้อยที่จะเกิดขึ้นบนตารางสายรุ้ง นอกจากนี้ การบังคับใช้อย่างดุเดือดกับบัญชีผู้ใช้ทั้งหมดของคุณจะทำให้ผู้โจมตีต้องแฮชรหัสผ่านทุกอันที่เขาพยายามทุกครั้งที่พบเกลือ ดังนั้นแค่ทำให้เกลือยาวและใส่มากกว่า 0-9
ลงไป!
- person mvds; 25.08.2010
rand()
นั้นง่ายที่สุดในการรับข้อความ
- person mvds; 25.08.2010
แฮชคือ "ฟังก์ชันทางเดียว" คุณป้อนรหัสผ่านและได้รับเอาต์พุตเฉพาะโดยประมาณที่ไม่สามารถแปลงกลับเป็นรหัสผ่านจริงได้ (ตามความเป็นไปได้ในการคำนวณ) มันจะดูแตกต่างออกไปขึ้นอยู่กับแฮช ตัวอย่างเช่น ด้วย sha1 (http://php.net/manual/en/function.sha1.php) คุณจะได้สตริงที่ยาว 20 ไบต์เสมอ
ข้อดีก็คือรหัสผ่านจริงจะไม่ถูกจัดเก็บในรูปแบบข้อความธรรมดา ในการตรวจสอบรหัสผ่านของผู้ใช้ คุณเพียงคำนวณแฮชของรหัสผ่านที่ควรจะเป็นและเปรียบเทียบกับแฮชที่เก็บไว้ หากมีใครเข้าถึงฐานข้อมูลรหัสผ่านของคุณ ก็แสดงว่าพวกเขายังไม่มีรหัสผ่านจริง
md5($password)
และแฮชของฉันคือ 08b5411f848a2581a41672a759c87380
คุณช่วยบอกฉันได้ไหมว่ารหัสผ่านของฉันคืออะไร
- person mvds; 25.08.2010
ยังไม่มีใครบอกว่าทำไม ฉันขอเถอะ: ผู้ใช้ส่วนใหญ่งี่เง่าและใช้รหัสผ่านเดียวกันทุกที่ คุณไม่ต้องการให้แฮกเกอร์เจาะเข้าสู่ระบบของคุณ หยิบรหัสผ่านแล้วไปแฮ็กบัญชีผู้ใช้ของคุณทุกที่