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
- Prefix (
$2a$): บอกถึงเวอร์ชันของอัลกอริทึม Bcrypt ที่ใช้ - Cost Factor (
12): คือจำนวนรอบในการคำนวณ ( Key derivation iterations ) ยิ่งตัวเลขสูง ยิ่งใช้เวลาประมวลผลนาน ทำให้แฮกเกอร์เดารหัสผ่านได้ยากขึ้น - Salt (
R9h/cIPz0gi.URNNX3kh2O): นี่คือส่วนของ Salt ( ปกติยาว 22 ตัวอักษร ) ที่ถูกสุ่มขึ้นมาและเก็บไว้ในตัวมันเองเลย - 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 ครับ
อ่านเพิ่มเติม
