0Pricing
PHP Academy · บทเรียน

การจัดเก็บรหัสผ่านอย่างปลอดภัย

แฮชรหัสผ่านด้วย 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 login

password_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); // true

Argon2 ใน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การป้องกัน Cross-Site Scripting (XSS)
  2. SQL Injection และคำสืบค้นแบบกำหนดพารามิเตอร์
  3. การป้องกัน CSRF
  4. การจัดเก็บรหัสผ่านอย่างปลอดภัย
← กลับไปที่ PHP Academy