การจัดเก็บรหัสผ่านอย่างปลอดภัย
แฮชรหัสผ่านด้วย password_hash และตรวจสอบด้วย password_verify
การจัดเก็บรหัสผ่านอย่างปลอดภัย เป็นบทเรียน PHP Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน PHP Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน
อย่าจัดเก็บรหัสผ่านแบบข้อความธรรมดา
การจัดเก็บรหัสผ่านแบบข้อความธรรมดาหมายความว่าเมื่อฐานข้อมูลรั่วไหล รหัสผ่านของผู้ใช้ทุกคนจะถูกเปิดเผย ควรจัดเก็บแฮชแบบเข้ารหัสเสมอ โดยควรใช้ bcrypt, Argon2id หรือ scrypt
password_hash()
ฟังก์ชัน password_hash() ในตัวของ PHP จะสร้างแฮชที่ปลอดภัยพร้อมค่าเกลือแบบสุ่มซึ่งรวมอยู่ในผลลัพธ์
<?php
$hash = password_hash("mysecretpassword", PASSWORD_BCRYPT);
// Output: $2y$10$... (includes algorithm, cost, salt, hash)password_verify()
ตรวจสอบรหัสผ่านแบบข้อความธรรมดากับแฮชที่จัดเก็บไว้
<?php
$hash = "$2y$10$abcdef...";
$valid = password_verify("mysecretpassword", $hash);
if ($valid) {
echo "Correct password!";
}ตัวเลือกอัลกอริทึม
PHP รองรับ:
PASSWORD_BCRYPT— รองรับอย่างแพร่หลาย จำกัดที่ 72 ไบต์PASSWORD_ARGON2I— ใช้หน่วยความจำสูงในการคำนวณ (PHP 7.2 ขึ้นไป)PASSWORD_ARGON2ID— แนะนำให้ใช้ และต้านทานการโจมตีด้วย GPU (PHP 7.3 ขึ้นไป)PASSWORD_DEFAULT— ปัจจุบันใช้ bcrypt แต่อาจเปลี่ยนแปลงใน PHP รุ่นต่อ ๆ ไป
ปัจจัยต้นทุน
ปัจจัยต้นทุนจะควบคุมว่าการคำนวณแฮชช้าหรือเร็วเพียงใด ต้นทุนที่สูงขึ้นหมายถึงการโจมตีแบบเดารหัสผ่านทีละจำนวนมากจะช้าลง ค่า bcrypt เริ่มต้นคือ 10
<?php
$hash = password_hash("secret", PASSWORD_BCRYPT, ["cost" => 12]);
// Cost 12 takes ~0.5s on typical hardware — acceptable for loginpassword_needs_rehash()
หลังจากอัปเกรด PHP หรือเปลี่ยนการตั้งค่าต้นทุน ให้ตรวจสอบว่าแฮชที่มีอยู่จำเป็นต้องอัปเกรดหรือไม่
<?php
if (password_verify($plain, $storedHash) &&
password_needs_rehash($storedHash, PASSWORD_DEFAULT)) {
$user->update(["password" => password_hash($plain, PASSWORD_DEFAULT)]);
}ฟาซาด Hash ของ Laravel
Laravel ครอบ password_hash ไว้ในฟาซาด Hash โดยใช้ bcrypt เป็นค่าเริ่มต้น
<?php
use Illuminate\Support\Facades\Hash;
$hash = Hash::make("mysecretpassword");
$valid = Hash::check("mysecretpassword", $hash); // trueArgon2 ใน Laravel
กำหนดค่า Laravel ให้ใช้ Argon2id ใน config/hashing.php
// config/hashing.php
"driver" => "argon2id",การจัดการค่าเกลือ
ฟังก์ชันแฮชสมัยใหม่ของ PHP จะเพิ่มค่าเกลือแบบสุ่มทางการเข้ารหัสให้อัตโนมัติ อย่าสร้างการเติมค่าเกลือขึ้นเอง เพราะทำผิดพลาดได้ง่าย
Pepper (ความลับระดับแอปพลิเคชัน)
สามารถนำความลับเพิ่มเติมที่ไม่บังคับ หรือ pepper ซึ่งจัดเก็บไว้นอกฐานข้อมูล มาผสมก่อนทำแฮชได้ แม้ฐานข้อมูลจะถูกขโมย ผู้โจมตีก็ไม่สามารถเดารหัสผ่านทีละจำนวนมากได้หากไม่มี pepper
การเปรียบเทียบที่ปลอดภัยต่อการโจมตีตามเวลา
password_verify() ใช้การเปรียบเทียบที่ใช้เวลาคงที่ภายใน จึงช่วยป้องกันการโจมตีตามเวลา อย่าเปรียบเทียบแฮชด้วย ==
สรุป
ใช้ password_hash() ร่วมกับ PASSWORD_DEFAULT หรือ PASSWORD_ARGON2ID ตรวจสอบด้วย password_verify() และทำแฮชใหม่เมื่อเข้าสู่ระบบหากจำเป็น อย่าจัดเก็บรหัสผ่านแบบข้อความธรรมดา และอย่าใช้ MD5/SHA1 กับรหัสผ่าน
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ฟังก์ชันใดใช้ตรวจสอบรหัสผ่านกับแฮชที่สร้างโดย PHP
คำถามที่พบบ่อย
บทเรียน “การจัดเก็บรหัสผ่านอย่างปลอดภัย” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การจัดเก็บรหัสผ่านอย่างปลอดภัย” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส PHP Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส PHP Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การจัดเก็บรหัสผ่านอย่างปลอดภัย”
แฮชรหัสผ่านด้วย password_hash และตรวจสอบด้วย password_verify คุณปฏิบัติ PHP Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน PHP Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน PHP Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การจัดเก็บรหัสผ่านอย่างปลอดภัย” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน PHP Academy นี้ได้ไหม
ได้ บทเรียน PHP Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การป้องกัน Cross-Site Scripting (XSS)
- SQL Injection และคำสืบค้นแบบกำหนดพารามิเตอร์
- การป้องกัน CSRF
- การจัดเก็บรหัสผ่านอย่างปลอดภัย