Bcrypt: Password Hashing

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


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

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

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

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

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

  1. Prefix ( $2a$ ): บอกถึงเวอร์ชันของอัลกอริทึม Bcrypt ที่ใช้
  2. Cost Factor ( 12 ): คือจำนวนรอบในการคำนวณ ( Key derivation iterations ) ยิ่งตัวเลขสูง ยิ่งใช้เวลาประมวลผลนาน ทำให้แฮกเกอร์เดารหัสผ่านได้ยากขึ้น
  3. Salt ( R9h/cIPz0gi.URNNX3kh2O ): นี่คือส่วนของ Salt ( ปกติยาว 22 ตัวอักษร ) ที่ถูกสุ่มขึ้นมาและเก็บไว้ในตัวมันเองเลย
  4. Hash Text ( PST9/TVBGL6NJ5kGKAq7slgnzpsS.66 ): คือผลลัพธ์สุดท้ายที่ได้จากการนำ Password + Salt ไปผ่านกระบวนการเข้ารหัส

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

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

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

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

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

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

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