ตัวสร้าง 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 ชัดเจน

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

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

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

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

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

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

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

ตัวสร้าง JWT

สร้าง JWT ที่มีการลงนาม โดยกำหนดหัวข้อ (header) แบบกำหนดเอง สิทธิ์ของพารามิเตอร์ในเนื้อหา (payload claims) การลงนามด้วย HMAC หรือ RSA รวมถึงกำหนดระยะเวลาหมดอายุและกลุ่มผู้ใช้งานที่อนุญาต เพื่อใช้ในการทดสอบ

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

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

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

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

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