ตัวสร้าง bcrypt Hash

สร้าง hash

ค่ายิ่งสูง = ช้าลงแต่ปลอดภัยขึ้น ค่าเริ่มต้นที่ดีคือ 12

บางครั้งคุณมี bcrypt hash จาก backup เก่าและมีรหัสผ่าน plaintext แล้วต้องรู้ว่ามันตรงกันไหม หรือคุณมีรหัสผ่านและอยากได้ hash ที่ cost factor หนึ่งจะสร้างออกมา เครื่องมือนี้ทำได้ทั้งสองอย่าง: พิมพ์รหัสผ่านแล้วสร้าง hash ใหม่ หรือวาง hash กับ candidate แล้วบอกว่าการ verify สำเร็จหรือไม่, โดยใช้การเปรียบเทียบแบบ constant-time เช่นเดียวกับระบบ login จริง

สร้างหรือ verify bcrypt

  1. 1

    เลือกโหมด

    สร้าง hash ใหม่จากรหัสผ่าน หรือ verify รหัสผ่านกับ hash `$2a$` / `$2b$` / `$2y$` ที่มีอยู่

  2. 2

    สำหรับ generate: ป้อน plaintext และ cost

    Cost 4-13; 10-12 คือค่าปกติ ระบบจะสร้าง salt สุ่ม 16-byte ให้ hash แต่ละตัว

  3. 3

    สำหรับ verify: วาง hash และ plaintext

    เครื่องมือจะดึง salt และ cost จาก hash แล้ว hash plaintext ใหม่ด้วยพารามิเตอร์เดียวกัน

  4. 4

    อ่านผลลัพธ์

    โหมด generate ให้คัดลอก hash 60 ตัวอักษร; โหมด verify คืนค่า match สีเขียวหรือ mismatch สีแดง

ภายในโหมด verify

เมื่อมี hash ที่เก็บไว้ เช่น:

$2b$12$mE2n5YqWjKqT9tXg.OQPoeeHZJ9hdSvOt5wFdRRQwl6yE1vWWY3z6

ตัวตรวจสอบจะ:

  1. Parse version (2b), cost (12), salt (22 ตัวอักษรแรกหลัง cost) และ digest (31 ตัวอักษรท้าย)
  2. รัน bcrypt ซ้ำบน candidate plaintext ด้วย salt และ cost ที่ดึงออกมา
  3. เปรียบเทียบ 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 คำนวณที่นั่น ไม่มีการเก็บ ไม่มีการบันทึก และไม่ถูกเพิ่มลงในลิงก์ของหน้าเว็บ

salt ถูกสุ่มต่อ hash นั่นคือจุดประสงค์หลัก, ผู้ใช้สองคนที่มีรหัสผ่านเดียวกันจะได้ hash ต่างกัน ทำให้ rainbow tables ใช้ไม่ได้

ได้ นั่นคือสิ่งที่โหมด verify ทำ: วาง hash ที่คุณมี วางรหัสผ่านที่ต้องการทดสอบ แล้วเครื่องมือจะยืนยันหรือปฏิเสธว่าตรงกัน

รองรับ variant สมัยใหม่ทั้งหมดทำงานร่วมกันได้, digest เข้ากันข้าม version; ต่างกันเฉพาะ tag hash $2$ เก่าบางตัวจากระบบยุคปี 2000 อาจต้องใช้ไลบรารีที่รองรับ legacy ชัดเจน

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

เครื่องมือเข้ารหัสซีซาร์

เข้ารหัสและถอดรหัสข้อความด้วยรหัสซีซาร์ เลื่อนได้ตั้งแต่ 1-25 รองรับ ROT13 เป็นกรณีพิเศษ และคงเครื่องหมายวรรคตอนกับตัวพิมพ์ใหญ่-เล็กไว้เหมือนเดิม

ตัวเข้ารหัสและถอดรหัส Base58

เข้ารหัสข้อความ UTF-8 หรือไบต์เลขฐานสิบหก และถอดรหัส Base58 อย่างปลอดภัยด้วยชุดอักขระ Bitcoin, Ripple หรือ Flickr

ตัวเข้ารหัสไฟล์ Base64

เข้ารหัสไฟล์ใดก็ได้ (PDF, ZIP, รูปภาพ, ไฟล์ปฏิบัติการ) เป็นข้อความ Base64 เพื่อฝังใน JSON, อีเมล, YAML หรือ data URI ทำงานในเครื่องของคุณ ไม่มีการอัปโหลด

ตัวสร้าง bcrypt

สร้าง bcrypt hash จากรหัสผ่าน plaintext ปรับ cost factor ได้ตั้งแต่ 4 ถึง 13 ใช้ร่วมกับ Laravel, Django, Node และ PHP ได้

เข้ารหัส / ถอดรหัส AES

เข้ารหัสและถอดรหัสข้อความความเสี่ยงต่ำด้วย AES cipher ของ OpenSSL passphrase จะถูก hash ด้วย SHA-256 และผลลัพธ์ Base64 มี IV รวมกับข้อความเข้ารหัส

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

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

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