แปลงเลขฐานสิบหก (Hex) เป็น Base64

วางไบต์เลขฐานสิบหกแล้วรับข้อมูลชุดเดียวกันในรูป Base64 ตัวแปลงจะลบตัวคั่นอย่างช่องว่าง ทวิภาค และตัวนำหน้า 0x ออกให้อัตโนมัติ คุณจึงวางค่าแฮชและลายนิ้วมือได้ตามที่คัดลอกมา

ทำงานภายในเบราว์เซอร์ของคุณทั้งหมด ไม่มีการอัปโหลดข้อมูลใด ๆ

วิธีใช้งาน

  1. วางสตริงเลขฐานสิบหกลงในช่องอินพุต ระบบเลือกเลขฐานสิบหกไว้ในช่อง “จาก” และ Base64 ไว้ในช่อง “เป็น” ให้แล้ว
  2. ไม่ต้องกังวลเรื่องรูปแบบ ตัวแปลงจะละเว้นช่องว่าง การขึ้นบรรทัดใหม่ ทวิภาค ขีดกลาง และตัวนำหน้า 0x หรือ \x
  3. หากจะนำค่าไปใช้ใน URL, JWT หรือ JSON Web Key ให้เปลี่ยนช่อง “เป็น” เป็น Base64URL
  4. คัดลอกผลลัพธ์ Base64

ทำไมต้องแปลงเลขฐานสิบหกเป็น Base64

เครื่องมือคำนวณแฮชส่วนใหญ่แสดงค่าไดเจสต์เป็นเลขฐานสิบหก แต่หลายโปรโตคอลต้องการ Base64 ซึ่งสั้นกว่าหนึ่งในสาม กรณีที่พบบ่อยได้แก่

  • Subresource Integrity แอตทริบิวต์ integrity ของสคริปต์และสไตล์ชีตเก็บค่าไดเจสต์แบบ Base64 เช่น sha384- ตามด้วยอักขระ Base64 จำนวน 64 ตัว
  • Content Security Policy ค่าแฮชที่อนุญาตให้รันสคริปต์แบบอินไลน์เขียนในรูป 'sha256-...' พร้อมค่า Base64
  • เช็กซัมใน HTTP API ส่วนหัว Content-MD5 และส่วนหัวเช็กซัมของ Amazon S3 บรรจุค่า Base64 ของไดเจสต์แบบไบนารี ไม่ใช่สตริงเลขฐานสิบหกที่ md5sum แสดงออกมา
  • ตัวระบุแบบกะทัดรัด UUID มีขนาด 16 ไบต์ หรือเลขฐานสิบหก 32 หลัก แต่เหลือเพียง 22 อักขระเมื่อเขียนเป็น Base64URL แบบไม่มีแพดดิง

รูปแบบเลขฐานสิบหกที่รองรับ

เลขฐานสิบหกไม่แยกตัวพิมพ์เล็ก-ใหญ่ ก่อนถอดรหัส ตัวแปลงจะลบช่องว่าง การขึ้นบรรทัดใหม่ ทวิภาค อัฒภาค จุลภาค ขีดกลาง และตัวนำหน้า 0x, \x, % และ &#x ออก จึงรองรับลายนิ้วมือของ OpenSSL อย่าง AB:CD:EF อาร์เรย์ภาษา C อย่าง 0x12, 0x34 สตริงแบบ escape อย่าง \x12\x34 ไบต์ที่เข้ารหัสแบบเปอร์เซ็นต์ และ UUID ที่มีขีดกลาง

หลังจากลบอักขระเหล่านี้แล้ว อินพุตต้องมีจำนวนหลักเป็นเลขคู่ คือสองหลักต่อหนึ่งไบต์ หากจำนวนหลักเป็นเลขคี่ ตัวแปลงจะแจ้งข้อผิดพลาด ซึ่งมักหมายความว่าเลขศูนย์นำหน้าหายไป เช่น เขียน abc ทั้งที่ตั้งใจจะเขียน 0abc

เข้ารหัสไบต์ ไม่ใช่ข้อความเลขฐานสิบหก

ข้อผิดพลาดที่พบบ่อยคือการวางไดเจสต์เลขฐานสิบหกลงในตัวเข้ารหัสข้อความเป็น Base64 ทั่วไป ซึ่งจะเข้ารหัสอักขระ 0-9a-f แทนที่จะเข้ารหัสไบต์ที่อักขระเหล่านั้นแทนอยู่ ผลลัพธ์จึงยาวเป็นสองเท่าของที่ควรเป็น คือ 88 อักขระสำหรับไดเจสต์ SHA-256 แทนที่จะเป็น 44 อักขระ ระบบใดก็ตามที่ต้องการไดเจสต์แบบไบนารี เช่น แอตทริบิวต์ SRI หรือส่วนหัวเช็กซัม จะปฏิเสธค่านั้น ตัวแปลงนี้จึงถอดรหัสเลขฐานสิบหกเป็นไบต์ก่อน

# Shell: แปลงไดเจสต์เลขฐานสิบหกเป็น Base64
printf '%s' "$HEX" | xxd -r -p | base64

# ค่า SRI ของไฟล์ในขั้นตอนเดียว
openssl dgst -sha384 -binary script.js | openssl base64 -A

# Python
base64.b64encode(bytes.fromhex(h)).decode()

// Node.js (หยุดทำงานโดยไม่แจ้งเตือนเมื่อพบอักขระแรกที่ไม่ใช่เลขฐานสิบหก)
Buffer.from(h, 'hex').toString('base64')

คำถามที่พบบ่อย

ทำไมสตริงเลขฐานสิบหกจึงแสดงข้อผิดพลาด

อาจเป็นเพราะอินพุตมีอักขระที่ไม่ใช่เลขฐานสิบหก เช่น ตัวอักษร O แทนเลขศูนย์ หรือจำนวนหลักเป็นเลขคี่ ข้อความแสดงข้อผิดพลาดจะบอกตำแหน่งของอักขระที่ไม่ถูกต้อง หากความยาวเป็นเลขคี่ ให้ตรวจสอบว่าเลข 0 นำหน้าหายไปหรือไม่

เอาต์พุต Base64 จะยาวเท่าไร
หารจำนวนหลักเลขฐานสิบหกด้วย 2 เพื่อหาจำนวนไบต์ แล้วนับ 4 อักขระต่อทุก 3 ไบต์โดยปัดขึ้น ไดเจสต์ SHA-256 ที่ยาว 64 หลักจะกลายเป็น Base64 จำนวน 44 อักขระ ซึ่งรวมเครื่องหมาย = หนึ่งตัว
จะสร้างค่าแฮชสำหรับแอตทริบิวต์ Subresource Integrity ได้อย่างไร
คำนวณไดเจสต์ SHA-384 ของไฟล์ แปลงไดเจสต์เลขฐานสิบหกด้วยเครื่องมือนี้ แล้วเขียน integrity="sha384-..." โดยใส่ค่า Base64 ที่ได้ หากใช้ OpenSSL จะทำได้ในคำสั่งเดียว: openssl dgst -sha384 -binary file.js | openssl base64 -A
เอาต์พุตเป็น Base64 แบบมาตรฐานหรือแบบปลอดภัยสำหรับ URL
เป็น Base64 แบบมาตรฐานที่ใช้ + และ / ตามที่ SRI, CSP และส่วนหัวเช็กซัมของ HTTP กำหนด หากต้องการเอาต์พุตแบบปลอดภัยสำหรับ URL ให้เลือก Base64URL ในช่อง “เป็น”