วัน: 28 มีนาคม 2026

Bcrypt: Password HashingBcrypt: Password Hashing

Bcrypt ย่อมาจาก Blowfish crypt เป็นอัลกอริทึมสำหรับแฮชรหัสผ่าน ที่พัฒนาโดย Niels Provos และ David Mazières โดยนำหลักการของ Blowfish block cipher มาปรับใช้ ออกแบบมาเพื่อป้องกันการโจมตีแบบ Brute-force โดยเน้นความช้าในการคำนวณและเพิ่มความปลอดภัยสูง


จุดเด่นสำคัญของ Bcrypt

  • ใช้ Blowfish Cipher: เป็นฐานรากในการสร้างแฮช
  • Salt: มีการเติมค่า Salt ลงในรหัสผ่านก่อนแฮช ทำให้ค่าที่ได้ไม่ซ้ำกันแม้รหัสผ่านเหมือนกัน ป้องกัน Rainbow table attack
  • Cost Factor : สามารถปรับความยาก / ช้า ในการแฮชได้ เพื่อให้ทันต่อความเร็วของคอมพิวเตอร์ในอนาคต
  • One-way Function: เป็นการแฮชทางเดียว ไม่สามารถถอดรหัสกลับมาเป็นรหัสผ่านต้นฉบับได้ 

โครงสร้างของ Bcrypt Hash

เมื่อคุณทำการ Hash รหัสผ่านด้วย Bcrypt คุณจะได้ข้อความยาว 60 ตัวอักษร ซึ่งจะถูกแบ่งออกเป็นส่วนหลัก ๆ ดังนี้ครับ

$2a$12$R9h/cIPz0gi.URNNX3kh2OPST9/TVBGL6NJ5kGKAq7slgnzpsS.66

  1. Prefix : บอกถึงเวอร์ชันของอัลกอริทึม Bcrypt ที่ใช้
  2. Cost Factor : คือจำนวนรอบในการคำนวณ ยิ่งตัวเลขสูง ยิ่งใช้เวลาประมวลผลนาน ทำให้แฮกเกอร์เดารหัสผ่านได้ยากขึ้น
  3. Salt : นี่คือส่วนของ Salt ที่ถูกสุ่มขึ้นมาและเก็บไว้ในตัวมันเองเลย
  4. Hash Text : คือผลลัพธ์สุดท้ายที่ได้จากการนำ Password + Salt ไปผ่านกระบวนการเข้ารหัส

ทำไมต้องเก็บ Salt ไว้ข้างใน ?

กลไกของ Bcrypt ถูกออกแบบมาเพื่อความสะดวกและปลอดภัย ดังนี้ครับ

  • ความสะดวกในการตรวจสอบ: เมื่อผู้ใช้ล็อกอิน ระบบจะดึง Hash ตัวเดิมจาก Database มาดู แล้วดึงเอาค่า Salt และ Cost Factor จากตัวมันเองมาใช้เพื่อ Hash รหัสผ่านที่ผู้ใช้เพิ่งพิมพ์เข้ามาใหม่ ถ้าผลลัพธ์ตรงกัน ก็ถือว่าผ่าน
  • ป้องกัน Rainbow Tables: การมี Salt ที่ไม่ซ้ำกันในทุก ๆ User ทำให้แฮกเกอร์ไม่สามารถใช้ตารางรหัสผ่านสำเร็จรูป มาเจาะระบบได้ เพราะรหัสเดียวกันแต่ Salt ต่างกัน ผลลัพธ์ Hash ก็จะต่างกันโดยสิ้นเชิงครับ

ข้อควรระวังในการใช้งาน

แม้ Bcrypt จะปลอดภัยมาก แต่ก็มีจุดที่ต้องพิจารณา

  • ความเร็วเครื่องเซิร์ฟเวอร์: การตั้งค่า Cost Factor สูงเกินไปอาจทำให้ CPU ทำงานหนักจนระบบช้า แต่ถ้าต่ำไปก็จะไม่ปลอดภัย
  • จำกัดความยาวรหัสผ่าน: Bcrypt ส่วนใหญ่จะรองรับรหัสผ่านยาวไม่เกิน 72 ตัวอักษร หากยาวกว่านั้น ตัวอักษรที่เกินมาจะไม่มีผลต่อค่า Hash ครับ

อ่านเพิ่มเติม