ตัวสร้าง bcrypt
bcrypt ยังคงเป็นหนึ่งในตัวเลือกที่ปลอดภัยที่สุดสำหรับการเก็บรหัสผ่าน มันถูกออกแบบให้ช้าโดยตั้งใจ สร้าง salt ของตัวเอง และปรับตามความแรงของฮาร์ดแวร์ได้ผ่านพารามิเตอร์ cost เครื่องมือนี้สร้าง bcrypt hash ที่เป็นไปตามมาตรฐานจากรหัสผ่าน plaintext เพื่อให้คุณ seed ผู้ใช้ทดสอบ ย้ายบัญชีระหว่างระบบ หรือเทียบค่ากับ hash เดิมที่เก็บอยู่ในคอลัมน์ users.password ได้
วิธี hash รหัสผ่านด้วย bcrypt
-
1
ป้อนรหัสผ่าน plaintext
ได้สูงสุด 72 bytes — bcrypt จะตัดส่วนที่เกินออกแบบเงียบๆ
-
2
เลือก cost factor
10 คือค่าเริ่มต้นปัจจุบัน; 12 พบได้บ่อยในระบบใหม่; 14 คือระดับระแวดระวังสูง ทุกๆ +1 จะทำให้เวลา hash เพิ่มขึ้นประมาณสองเท่า
-
3
สร้าง salt แบบสุ่ม
ดึง salt 16 bytes จาก cryptographic RNG แล้วฝังไว้ในสตริง hash ที่ได้
-
4
คัดลอก hash
เอาต์พุตเป็นสตริงที่อธิบายตัวเอง เช่น `$2b$12$...` ซึ่งรวม version, cost, salt และ digest ไว้แล้ว
โครงสร้างของ bcrypt hash
$2b$12$mE2n5YqWjKqT9tXg.OQPoeeHZJ9hdSvOt5wFdRRQwl6yE1vWWY3z6
| | | |
| | salt (22 Base64 chars) digest (31 Base64 chars)
| cost (2 digits, 4-31)
version (2a, 2b, 2y — all bcrypt)
ทั้งสตริงยาว 60 ตัวอักษร คอลัมน์ชนิด VARCHAR(60) หรือ CHAR(60) คือ schema มาตรฐาน
คำแนะนำ cost factor
| Cost | เวลาโดยประมาณต่อ hash หนึ่งครั้ง (CPU 2024) | การใช้งาน |
|---|---|---|
| 10 | ~80 ms | ค่าเริ่มต้นเก่า ยังพอรับได้ |
| 12 | ~300 ms | baseline ที่แนะนำในปัจจุบัน |
| 13 | ~600 ms | แอปที่ต้องการความปลอดภัยสูงขึ้น |
| 14 | ~1.2 s | ระดับระแวงสูง; login จะรู้สึกช้าลง |
ทุก increment เพิ่ม work factor เป็นสองเท่า ถ้า latency การ login ต่ำกว่า 500 ms สำคัญมาก ให้คงไว้ที่ 10-12
Version byte: 2a vs 2b vs 2y
$2a$— สเปกดั้งเดิมปี 1999 ไลบรารีส่วนใหญ่ออก hash แบบ2a$2b$— revision ปี 2014 ที่แก้บั๊ก truncation ใน crypt_blowfish แนะนำสำหรับ hash ใหม่$2y$— tag เฉพาะ PHP เทียบเท่ากับ$2b$ในทางปฏิบัติ
ทั้งสามแบบ verify ข้ามกันได้ ต่างกันเฉพาะ tag ในสตริง hash
bcrypt ป้องกันอะไรได้บ้าง
- Rainbow tables — salt ที่ไม่ซ้ำต่อ hash ทำให้ lookup ที่คำนวณล่วงหน้าใช้ไม่ได้
- GPU/ASIC cracking — key schedule ของ Blowfish ใช้หน่วยความจำมากและไม่เป็นมิตรกับ GPU แม้ไม่ต้าน GPU เท่า Argon2 แต่ยัง brute force ได้ช้า
- Database leaks — ไม่สามารถกู้ plaintext จาก hash ได้โดยไม่ brute force
สิ่งที่ bcrypt ไม่ได้ป้องกัน: รหัสผ่านอ่อนแอ (ควรกำหนดความยาวขั้นต่ำและตรวจกับ breach lists), credential stuffing (ใช้ second factor), phishing
ขีดจำกัด 72-byte
bcrypt ใช้เฉพาะ 72 bytes แรกของรหัสผ่าน อินพุตที่ยาวกว่านั้นจะถูกตัดแบบเงียบๆ นี่เป็นเหตุผลเดียวกับที่หลายไลบรารีปัจจุบันแนะนำให้ pre-hash รหัสผ่านด้วย SHA-256 ก่อนส่งเข้า bcrypt ทางเลือกสมัยใหม่อย่าง Argon2 และ scrypt ไม่มีข้อจำกัดนี้
คำถามที่พบบ่อย
ปลอดภัยสำหรับการเก็บรหัสผ่านที่ cost ≥ 12 OWASP ยังจัดให้เป็น algorithm ที่ยอมรับได้ Argon2id เป็นตัวเลือกที่แนะนำสำหรับระบบใหม่ แต่การย้าย hash bcrypt เก่ายังไม่ใช่เรื่องเร่งด่วนสูง
เพราะ salt ถูกสุ่มต่อ hash การ verify จะดึง salt จาก hash ที่เก็บไว้ นำรหัสผ่านที่ส่งเข้ามาไป hash ใหม่ด้วย salt นั้น แล้วเปรียบเทียบ
ไลบรารีส่วนใหญ่ไม่เปิดให้ทำ และมีเหตุผลที่ดี — salt ที่คาดเดาได้ทำลายจุดประสงค์ของมัน ใช้ salt ที่ไลบรารีสร้างให้ นั่นคือทางที่ปลอดภัย
มี — work factor เป็นสมมาตร การ verify hash cost-14 ใช้เวลานานกว่า cost-10 ถึง 16x ปรับค่าโดยคำนึงถึง throughput การ login ของคุณ
เครื่องมือที่เกี่ยวข้อง
ตัวเข้ารหัสรหัสลับ A1Z26
เข้ารหัสข้อความด้วยรหัสลับ A1Z26 (A=1, B=2, ... Z=26) หรือถอดรหัสลำดับตัวเลขกลับเป็นตัวอักษร พร้อมปรับตัวคั่นได้
เข้ารหัส / ถอดรหัส AES
เข้ารหัสและถอดรหัสข้อความความเสี่ยงต่ำด้วย AES cipher ของ OpenSSL passphrase จะถูก hash ด้วย SHA-256 และผลลัพธ์ Base64 มี IV รวมกับข้อความเข้ารหัส
ตัวเข้ารหัส Atbash Cipher
เข้ารหัสหรือถอดรหัสข้อความด้วยรหัส Atbash ซึ่งเป็นการแทนที่แบบฮีบรูที่จับคู่ A-Z เป็น Z-A การทำงานเดียวกันใช้ได้ทั้งเข้ารหัสและถอดรหัส
ตัวเข้ารหัสและถอดรหัส Base32
เข้ารหัสและถอดรหัสสตริง Base32 ด้วยตารางอักขระ RFC 4648 เหมาะสำหรับซีเคร็ต TOTP, โทเค็นที่ไม่แยกตัวพิมพ์ใหญ่เล็ก และตัวระบุที่มนุษย์ต้องพิมพ์
ตัวเข้ารหัสและถอดรหัส Base85
เข้ารหัสและถอดรหัส Base85 ในรูปแบบ Adobe Ascii85 (PostScript/PDF) หรือ Z85 (ZeroMQ) กะทัดรัดกว่า Base64 สำหรับข้อมูลไบนารี
ตัวสร้าง bcrypt Hash
สร้าง bcrypt hash หรือตรวจสอบรหัสผ่าน plaintext กับ bcrypt hash ที่มีอยู่ โหมด generate และ verify อยู่ข้างกันในเครื่องมือเดียว