ป้ายกำกับ: Security Best Practices

PHP: การใช้ password_hash() และ password_verify() สำหรับระบบรหัสผ่านPHP: การใช้ password_hash() และ password_verify() สำหรับระบบรหัสผ่าน

“>

ในฐานะ Senior Architect ด้านระบบความปลอดภัย การจัดการรหัสผ่าน (Password Management) ถือเป็นรากฐานที่สำคัญที่สุดของเว็บแอปพลิเคชันใดๆ การใช้ฟังก์ชันแฮชแบบเก่า เช่น MD5, SHA-1 หรือแม้แต่ SHA-256 เพียงอย่างเดียว ไม่เพียงพอต่อการรับมือกับการโจมตีในปัจจุบัน เนื่องจากผู้โจมตีสามารถใช้เทคนิค Rainbow Table หรือ GPU Brute Force เพื่อถอดรหัสกลับมาได้

“>

PHP ได้พัฒนาชุดฟังก์ชันที่ทันสมัยและปลอดภัยกว่าอย่าง password_hash() และ password_verify() ฟังก์ชันเหล่านี้ไม่ได้เป็นเพียงแค่การแฮชข้อมูลเท่านั้น แต่ยังรวมเอาหลักการด้านความปลอดภัยขั้นสูงสองประการเข้าไว้ด้วยกันโดยอัตโนมัติ คือ Salt (ค่าสุ่มที่ไม่ซ้ำกันสำหรับผู้ใช้แต่ละคน) และ Adaptive Hashing (การเพิ่มค่า Computational Cost เพื่อให้การคำนวณแฮชมีความหน่วงสูง)

การออกแบบ Schema ใน PostgreSQL

“>

เมื่อเราใช้ PHP ในการจัดการรหัสผ่าน เราต้องมั่นใจว่าคอลัมน์ที่เก็บค่า Hash ในฐานข้อมูล PostgreSQL มีขนาดเพียงพอที่จะรองรับค่า Hash ที่มีความยาวมาตรฐาน (โดยทั่วไปคือ 60-255 ตัวอักษร) เราจึงควรออกแบบตารางผู้ใช้งานดังนี้:

SQL

-- ตารางผู้ใช้งานสำหรับเก็บรหัสผ่านที่ถูกแฮชแล้ว<br>CREATE TABLE users (<br>    id SERIAL PRIMARY KEY,<br>    username VARCHAR(100) UNIQUE NOT NULL,<br>    password_hash VARCHAR(255) NOT NULL, -- ต้องมีขนาดใหญ่พอสำหรับค่า Hash<br>    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP<br>);

ขั้นตอนการใช้งาน PHP Hashing

  • 1. การสร้าง Hash (Registration):
    ใช้ password_hash() เพื่อสร้างค่า Hash ที่ปลอดภัย

    PHP

    $password = 'mySecurePassword123';<br>$hash = password_hash($password, PASSWORD_DEFAULT);<br>// $hash คือค่าที่ถูกเก็บลงในคอลัมน์ password_hash ของ PostgreSQL<br>print($hash);
    
  • 2. การตรวจสอบ Hash (Login):
    เมื่อผู้ใช้เข้าสู่ระบบ เราดึงค่า Hash ที่เก็บไว้จาก PostgreSQL มาเปรียบเทียบกับรหัสผ่านที่ผู้ใช้ป้อน

    PHP

    $input_password = 'mySecurePassword123';<br>$stored_hash = '... (ค่าที่ดึงจาก PostgreSQL) ...';<br><br>if (password_verify($input_password, $stored_hash)) {<br>    echo "Login Successful!";<br>} else {<br>    echo "Invalid credentials.";<br>}
    
“>

การใช้ password_hash() และ password_verify() ทำให้เราไม่ต้องจัดการเรื่อง Salt และ Cost Factor ด้วยตนเอง ซึ่งช่วยลดโอกาสเกิดข้อผิดพลาดด้านความปลอดภัยได้อย่างมาก

บทสรุปสำหรับสถาปนิกระบบ

“>

สำหรับระบบที่ใช้ PostgreSQL เป็นฐานข้อมูล การยึดมั่นในการใช้ PHP’s built-in password hashing functions อย่างสม่ำเสมอ ถือเป็น Best Practice ด้าน Security ที่สำคัญที่สุด ผู้พัฒนาควรหลีกเลี่ยงการเขียนฟังก์ชันแฮชเอง (Custom Hashing) และควรตรวจสอบให้แน่ใจว่ามีการอัปเกรดค่า Algorithm (เช่น การเปลี่ยนจาก Argon2 เป็นรุ่นที่ใหม่กว่า) เมื่อ PHP มีการอัปเดตเวอร์ชัน เพื่อรักษาความปลอดภัยของระบบในระยะยาว