ตัวสร้าง bcrypt Hash
สร้าง hash
ค่ายิ่งสูง = ช้าลงแต่ปลอดภัยขึ้น ค่าเริ่มต้นที่ดีคือ 12
บางครั้งคุณมี bcrypt hash จาก backup เก่าและมีรหัสผ่าน plaintext แล้วต้องรู้ว่ามันตรงกันไหม หรือคุณมีรหัสผ่านและอยากได้ hash ที่ cost factor หนึ่งจะสร้างออกมา เครื่องมือนี้ทำได้ทั้งสองอย่าง: พิมพ์รหัสผ่านแล้วสร้าง hash ใหม่ หรือวาง hash กับ candidate แล้วบอกว่าการ verify สำเร็จหรือไม่ — โดยใช้การเปรียบเทียบแบบ constant-time เช่นเดียวกับระบบ login จริง
สร้างหรือ verify bcrypt
-
1
เลือกโหมด
สร้าง hash ใหม่จากรหัสผ่าน หรือ verify รหัสผ่านกับ hash `$2a$` / `$2b$` / `$2y$` ที่มีอยู่
-
2
สำหรับ generate: ป้อน plaintext และ cost
Cost 4-14; 10-12 คือค่าปกติ ระบบจะสร้าง salt สุ่ม 16-byte ให้ hash แต่ละตัว
-
3
สำหรับ verify: วาง hash และ plaintext
เครื่องมือจะดึง salt และ cost จาก hash แล้ว hash plaintext ใหม่ด้วยพารามิเตอร์เดียวกัน
-
4
อ่านผลลัพธ์
โหมด generate ให้คัดลอก hash 60 ตัวอักษร; โหมด verify คืนค่า match สีเขียวหรือ mismatch สีแดง
ภายในโหมด verify
เมื่อมี hash ที่เก็บไว้ เช่น:
$2b$12$mE2n5YqWjKqT9tXg.OQPoeeHZJ9hdSvOt5wFdRRQwl6yE1vWWY3z6
ตัวตรวจสอบจะ:
- Parse version (
2b), cost (12), salt (22 ตัวอักษรแรกหลัง cost) และ digest (31 ตัวอักษรท้าย) - รัน bcrypt ซ้ำบน candidate plaintext ด้วย salt และ cost ที่ดึงออกมา
- เปรียบเทียบ digest ที่ได้กับของเดิมด้วย constant-time comparison
ถ้าเปรียบเทียบสำเร็จจะได้ true; ความต่างใดๆ จะได้ false
Constant-time comparison
การเปรียบเทียบสตริงสองตัวด้วย == แบบตรงไปตรงมาจะคืนค่าทันทีเมื่อ byte ต่างกัน — เป็น timing side channel ที่อาจทำให้ leak ตัวเลขของ hash ทีละตำแหน่งได้หากมี sample มากพอ ระบบตรวจรหัสผ่านใน production (และเครื่องมือนี้) ใช้ constant-time compare ที่ตรวจทุก byte เสมอ ดังนั้นเวลาตัดสินใจจึงไม่ขึ้นกับจำนวน byte ต้นที่ตรงกัน
กรณีวินิจฉัยที่พบบ่อย
| อาการ | สาเหตุที่เป็นไปได้ |
|---|---|
| การ verify ล้มเหลว ทั้งที่มั่นใจในรหัสผ่าน | มีช่องว่างต่อท้ายหรือ BOM ใน input ให้ตัดทั้งสองออก |
การ verify ล้มเหลว เวอร์ชัน 2y |
บางไลบรารีไม่ชอบ 2y แต่มันถูกต้องและเข้ากันได้ จากนี้ไปให้ทำ hash ใหม่ด้วย 2b |
| Hash สั้นเกินไป / รูปแบบผิด | ไม่ใช่ bcrypt hash MD5 ยาว 32 ตัวอักษรเลขฐานสิบหก, SHA-1 ยาว 40, bcrypt ยาว 60 พร้อมตัวคั่น $ |
| คำเตือน cost ไม่ตรงกัน | cost ที่เก็บไว้ต่ำกว่านโยบายขั้นต่ำ ควรทำ hash ใหม่เมื่อ login สำเร็จครั้งถัดไป |
Rehash ตอน login
แนวทางที่ดี: เมื่อผู้ใช้ login สำเร็จ ให้ตรวจว่า hash ที่เก็บไว้มี cost ต่ำกว่านโยบายปัจจุบันหรือไม่ ถ้าใช่ ให้ re-hash รหัสผ่านด้วย cost ใหม่แล้วอัปเดตฐานข้อมูล ภายในไม่กี่เดือนคุณจะยกระดับ hash ของผู้ใช้ทั้งหมดได้โดยไม่ต้องขอให้ใครเปลี่ยนรหัสผ่าน
สิ่งที่เครื่องมือนี้ไม่ได้ทำ
- การตรวจสอบทีละหลายรายการ — ออกแบบมาสำหรับ hash ทีละตัว
- การถอดรหัสหรือเดาแบบสุ่ม (brute force) — การโจมตีแบบพจนานุกรมหรือ rainbow-table อยู่นอกขอบเขตโดยตั้งใจ
- กู้คืนข้อความรหัสผ่านเดิม — bcrypt เป็นทางเดียว ถ้าลืมรหัสผ่าน ทางเดียวคือการรีเซ็ต
คำถามที่พบบ่อย
ไม่ การ hash และ verify เกิดขึ้นในเบราว์เซอร์ของคุณ ทั้ง plaintext และ hash ไม่ออกจากหน้าเว็บ
salt ถูกสุ่มต่อ hash นั่นคือจุดประสงค์หลัก — ผู้ใช้สองคนที่มีรหัสผ่านเดียวกันจะได้ hash ต่างกัน ทำให้ rainbow tables ใช้ไม่ได้
ได้ นั่นคือสิ่งที่โหมด verify ทำ: วาง hash ที่คุณมี วางรหัสผ่านที่ต้องการทดสอบ แล้วเครื่องมือจะยืนยันหรือปฏิเสธว่าตรงกัน
รองรับ variant สมัยใหม่ทั้งหมดทำงานร่วมกันได้ — digest เข้ากันข้าม version; ต่างกันเฉพาะ tag hash $2$ เก่าบางตัวจากระบบยุคปี 2000 อาจต้องใช้ไลบรารีที่รองรับ legacy ชัดเจน
เครื่องมือที่เกี่ยวข้อง
ตัวเข้ารหัสรหัสลับ 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
สร้าง bcrypt hash จากรหัสผ่าน plaintext ปรับ cost factor ได้ตั้งแต่ 4 ถึง 14 ใช้ร่วมกับ Laravel, Django, Node และ PHP ได้