ขีดจำกัด 72 ไบต์ของ bcrypt ส่งผลต่างกันไปตามภาษา อักษรไทยแต่ละตัวมักใช้ 3 ไบต์ในการเข้ารหัส UTF-8 ทำให้ขีดจำกัดที่แท้จริงของรหัสผ่านภาษาไทยอยู่ที่ราว 24 ตัวอักษร ไม่ใช่ 72 ตัวเหมือนภาษาละติน และเนื่องจากภาษาไทยไม่มีการเว้นวรรคระหว่างคำ บวกกับวรรณยุกต์และสระที่ลอยอยู่เหนือ-ใต้ตัวอักษร (ซึ่งแต่ละตัวก็เป็นโค้ดพอยต์แยกที่กินไบต์เพิ่ม) วลีรหัสผ่านภาษาไทยความยาวปกติจึงอาจแตะขีดจำกัดนี้เร็วกว่าที่คาดไว้มาก
เหตุใดความเร็วจึงทำร้ายความปลอดภัยของรหัสผ่าน
หากผู้โจมตีขโมยฐานข้อมูลแฮชรหัสผ่านไป พวกเขาจะพยายามกู้คืนรหัสผ่านต้นฉบับด้วยกำลังดุร้าย ด้วยฟังก์ชันที่เร็วอย่าง SHA-256 ฮาร์ดแวร์สมัยใหม่สามารถตรวจสอบพันล้านชุดค่าผสมต่อวินาที Bcrypt จงใจทำให้การแฮชหนึ่งครั้งใช้เวลาประมาณ 100 มิลลิวินาที ทำให้การโจมตีแบบกำลังดุร้ายช้าลงและมีค่าใช้จ่ายสูงขึ้นหลายเท่า
cost factor คืออะไร
พารามิเตอร์ "cost" ของ bcrypt กำหนดจำนวนรอบภายในเป็นเลขยกกำลังสอง (2^cost โดยทั่วไปคือ 10-12) การเพิ่มค่านี้ขึ้นหนึ่งหน่วยจะทำให้เวลาที่ใช้แฮชเพิ่มขึ้นเกือบสองเท่า และต้นทุนรวมของการโจมตีแบบกำลังดุร้ายของผู้โจมตีก็เพิ่มขึ้นสองเท่าเช่นกัน
Salt ในตัว
bcrypt สร้าง salt แบบสุ่มที่ไม่ซ้ำกันโดยอัตโนมัติสำหรับรหัสผ่านแต่ละตัว และฝังไว้ในผลลัพธ์โดยตรง — ไม่ต้องเก็บแยกต่างหาก รหัสผ่านที่เหมือนกันสองตัวจะให้แฮชต่างกัน และตารางแฮชที่คำนวณไว้ล่วงหน้า (rainbow table) สำหรับรหัสผ่านทั่วไปจะใช้การไม่ได้ — ต้องโจมตีแฮชแต่ละตัวแยกกัน
ทำไมต้องใช้สิ่งนี้
- จัดเก็บรหัสผ่านผู้ใช้อย่างถูกต้องในฐานข้อมูลของแอปพลิเคชัน
- เข้าใจว่าเหตุใด SHA-256 หรือ MD5 จึงเป็นตัวเลือกที่แย่สำหรับการแฮชรหัสผ่าน
- ทดสอบหรือย้ายระบบยืนยันตัวตนที่ใช้ bcrypt
ขีดจำกัดที่ซ่อนอยู่: 72 ไบต์ ไม่ใช่ 72 ตัวอักษร
bcrypt ประมวลผลเฉพาะ 72 ไบต์แรกของรหัสผ่านเท่านั้น ส่วนที่ยาวเกินกว่านั้นจะถูกตัดทิ้งโดยไม่มีการแจ้งเตือน สำหรับรหัสผ่านที่เป็นตัวอักษรละตินล้วน นี่คือ 72 ตัวอักษร แต่สำหรับรหัสผ่านภาษาไทยที่ใช้ 3 ไบต์ต่อตัวอักษร จำนวนตัวอักษรจริงที่พอดีกับขีดจำกัดนี้จะเหลือเพียงประมาณหนึ่งในสาม ควรคำนึงถึงเรื่องนี้เมื่อกำหนดความยาวสูงสุดของรหัสผ่านในฟอร์มสมัครสมาชิกสำหรับผู้ใช้ไทย