วิธีใช้งาน
- วางสตริงเลขฐานสิบหกลงในช่องอินพุต ระบบเลือกเลขฐานสิบหกไว้ในช่อง “จาก” และ Base64 ไว้ในช่อง “เป็น” ให้แล้ว
- ไม่ต้องกังวลเรื่องรูปแบบ ตัวแปลงจะละเว้นช่องว่าง การขึ้นบรรทัดใหม่ ทวิภาค ขีดกลาง และตัวนำหน้า 0x หรือ \x
- หากจะนำค่าไปใช้ใน URL, JWT หรือ JSON Web Key ให้เปลี่ยนช่อง “เป็น” เป็น Base64URL
- คัดลอกผลลัพธ์ 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 จะยาวเท่าไร
= หนึ่งตัวจะสร้างค่าแฮชสำหรับแอตทริบิวต์ Subresource Integrity ได้อย่างไร
integrity="sha384-..." โดยใส่ค่า Base64 ที่ได้ หากใช้ OpenSSL จะทำได้ในคำสั่งเดียว: openssl dgst -sha384 -binary file.js | openssl base64 -Aเอาต์พุตเป็น Base64 แบบมาตรฐานหรือแบบปลอดภัยสำหรับ URL
+ และ / ตามที่ SRI, CSP และส่วนหัวเช็กซัมของ HTTP กำหนด หากต้องการเอาต์พุตแบบปลอดภัยสำหรับ URL ให้เลือก Base64URL ในช่อง “เป็น”