ตัวสร้าง bcrypt

bcrypt ยังคงเป็นหนึ่งในตัวเลือกที่ปลอดภัยที่สุดสำหรับการเก็บรหัสผ่าน มันถูกออกแบบให้ช้าโดยตั้งใจ สร้าง salt ของตัวเอง และปรับตามความแรงของฮาร์ดแวร์ได้ผ่านพารามิเตอร์ cost เครื่องมือนี้สร้าง bcrypt hash ที่เป็นไปตามมาตรฐานจากรหัสผ่าน plaintext เพื่อให้คุณ seed ผู้ใช้ทดสอบ ย้ายบัญชีระหว่างระบบ หรือเทียบค่ากับ hash เดิมที่เก็บอยู่ในคอลัมน์ users.password ได้

วิธี hash รหัสผ่านด้วย bcrypt

  1. 1

    ป้อนรหัสผ่าน plaintext

    ได้สูงสุด 72 bytes — bcrypt จะตัดส่วนที่เกินออกแบบเงียบๆ

  2. 2

    เลือก cost factor

    10 คือค่าเริ่มต้นปัจจุบัน; 12 พบได้บ่อยในระบบใหม่; 14 คือระดับระแวดระวังสูง ทุกๆ +1 จะทำให้เวลา hash เพิ่มขึ้นประมาณสองเท่า

  3. 3

    สร้าง salt แบบสุ่ม

    ดึง salt 16 bytes จาก cryptographic RNG แล้วฝังไว้ในสตริง hash ที่ได้

  4. 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 อยู่ข้างกันในเครื่องมือเดียว