ตัวสร้าง bcrypt

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

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

  1. 1

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

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

  2. 2

    เลือก cost factor

    12 คือค่าเริ่มต้นในเครื่องมือนี้; 10 คือทางเลือกเก่าที่เร็วกว่า; 13 คือระดับที่แข็งแกร่งที่สุดของเครื่องมือนี้ ทุกๆ +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 เกินช่วงของเครื่องมือนี้ (สูงสุด 13)

ทุก 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 ที่ไลบรารีสร้างให้ นั่นคือทางที่ปลอดภัย

ทุกๆ +1 จะเพิ่มเวลา hash ประมาณสองเท่า ดังนั้น cost 13 จะใช้เวลานานกว่า cost 10 ประมาณ 8 เท่า ใช้ช่วง 10-12 เว้นแต่แอปของคุณจำเป็นต้องใช้ความแข็งแกร่งที่เพิ่มขึ้นจริงๆ

เครื่องมือที่เกี่ยวข้อง

รหัสแปลงตัวเลขเป็นตัวอักษร

แปลงตัวเลขเป็นตัวอักษรและย้อนกลับด้วยรหัส A=1, B=2 (A1Z26) สำหรับปริศนา คำทาย และเบาะแสในห้องเอสเคปรูม

เครื่องสร้างค่าแฮช MD5

คำนวณค่า checksum แบบ MD5 ของข้อความและไฟล์เพื่อยืนยันความสมบูรณ์ โดยผลลัพธ์จะตรงกับที่ได้จากฟังก์ชัน md5sum และ openssl dgst -md5

เครื่องสร้างพาสเฟรส (Passphrase)

สร้างพาสเฟรสที่จำง่ายจากคำทั่วไปแบบสุ่ม ปรับจำนวนคำ ตัวคั่น การขึ้นต้นด้วยตัวพิมพ์ใหญ่ และตัวเลขต่อท้ายที่เลือกได้

ตัวเข้ารหัสรหัสลับ A1Z26

เข้ารหัสข้อความด้วยรหัสลับ A1Z26 (A=1, B=2, ... Z=26) หรือถอดรหัสลำดับตัวเลขกลับเป็นตัวอักษร พร้อมปรับตัวคั่นได้

เครื่องมือสร้างกุญแจ PGP

สร้างคู่กุญแจ OpenPGP แบบ ASCII armor พร้อมใบรับรองการเพิกถอนด้วย Curve25519, RSA 2048 หรือ RSA 4096

เครื่องมือเข้ารหัส Polybius

เข้ารหัสอักษรละตินเป็นพิกัด Polybius หรือถอดรหัสคู่ตัวเลขที่คั่นด้วยช่องว่าง โดยใช้ตาราง 5×5 แบบคงที่ที่รวม I/J

เครื่องมือนี้มีให้บริการในภาษาอื่น