วิธีใช้งาน
- เลือก “เข้ารหัส” หรือ “ถอดรหัส” โดย “รูปแบบ” ถูกตั้งเป็นแบบปลอดภัยสำหรับ URL ไว้แล้ว และปิด “แพดดิง” ไว้
- พิมพ์หรือวางข้อความ ป้อนไบต์เลขฐานสิบหก หรือเปิดไฟล์ ผลลัพธ์จะอัปเดตทันทีขณะที่คุณพิมพ์
- เปิด “แพดดิง” เฉพาะเมื่อระบบปลายทางต้องการเครื่องหมาย = ต่อท้าย
- กด “คัดลอก” หรือ “ดาวน์โหลด” เพื่อรับผลลัพธ์
Base64URL คืออะไร
Base64URL กำหนดไว้ใน RFC 4648 หัวข้อ 5 ในชื่อ “Base 64 Encoding with URL and Filename Safe Alphabet” ซึ่งทำงานเหมือน Base64 มาตรฐานทุกประการ คืออักขระละ 6 บิต แต่สลับอักขระสองตัวที่สร้างปัญหาใน URL และพาธของไฟล์:
| Base64 มาตรฐาน | Base64URL | |
|---|---|---|
| ค่า 62 | + | - |
| ค่า 63 | / | _ |
| แพดดิง | = ต้องมี | มักละไว้ |
ใน URL เครื่องหมาย + อาจถูกตีความเป็นช่องว่าง / ใช้คั่นส่วนต่าง ๆ ของพาธ และ = ใช้คั่นชื่อคีย์กับค่าในสตริงคิวรี Base64 มาตรฐานจึงต้องผ่านการเข้ารหัสแบบเปอร์เซ็นต์ก่อนใส่ลงในลิงก์ ส่วน Base64URL ใส่ลงในลิงก์ได้ทันทีโดยไม่ต้องแปลงอักขระใด ๆ RFC 4648 อนุญาตให้ละแพดดิงได้เมื่อทราบความยาวจากบริบท และข้อกำหนดส่วนใหญ่ที่สร้างบน Base64URL ก็ทำเช่นนั้น
Base64URL ใช้ที่ไหนบ้าง
- JSON Web Token ส่วนหัว เพย์โหลด และลายเซ็นของ JWT แต่ละส่วนเป็น Base64URL ที่ไม่มีแพดดิง (RFC 7515) อ่าน JWT ได้ด้วย ตัวถอดรหัส JWT
- OAuth 2.0 PKCE ค่า
code_challengeคือแฮช SHA-256 ของ code verifier ในรูป Base64URL ที่ไม่มีแพดดิง (RFC 7636) จึงยาว 43 อักขระเสมอ - JSON Web Key และ WebAuthn พารามิเตอร์ของคีย์ เช่น
n,e,xและyรวมถึง challenge และ credential ID ของ WebAuthn จะแลกเปลี่ยนกันในรูป Base64URL - โทเค็น ID และชื่อไฟล์ ลิงก์รีเซ็ต URL ที่มีลายเซ็น และคีย์แคชใส่ค่า Base64URL ได้โดยไม่ต้องแปลงอักขระ โดย ID สุ่มขนาด 16 ไบต์จะกลายเป็น 22 อักขระ บนระบบไฟล์ที่ไม่แยกตัวพิมพ์เล็ก-ใหญ่ ควรใช้ Base32 แทน เพราะ Base64URL แยกแยะตัวพิมพ์เล็ก-ใหญ่
การแปลงระหว่าง Base64 และ Base64URL
ทั้งสองรูปแบบเข้ารหัสไบต์ชุดเดียวกัน การแปลงจึงเป็นเพียงการสลับอักขระ คือแทนที่ + ด้วย - และ / ด้วย _ แล้วลบ = ที่ต่อท้ายออก หากต้องการแปลงกลับ ให้สลับอักขระอีกครั้งและเติม = จนความยาวเป็นพหุคูณของ 4 ตัวถอดรหัสในหน้านี้รับได้ทั้งสองชุดตัวอักษร ไม่ว่าจะมีแพดดิงหรือไม่ก็ตาม
// Node.js 16+
Buffer.from(data).toString('base64url')
Buffer.from(str, 'base64url')
# Python (urlsafe_b64encode จะคงแพดดิงไว้)
base64.urlsafe_b64encode(data).rstrip(b'=')
// Go
base64.RawURLEncoding.EncodeToString(data)
// Java
Base64.getUrlEncoder().withoutPadding().encodeToString(bytes)
ข้อกำหนด
| ชุดตัวอักษร | A-Z a-z 0-9 - _ |
|---|---|
| ขนาดเอาต์พุต | 4 อักขระต่อ 3 ไบต์ (ประมาณ 133%) |
| แพดดิง | ไม่บังคับ และมักละไว้ |
| มาตรฐาน | RFC 4648 หัวข้อ 5 |
| แยกตัวพิมพ์เล็ก-ใหญ่ | ใช่ |
ตัวอย่าง
| อินพุต (UTF-8) | เอาต์พุต |
|---|---|
Hello, World! | SGVsbG8sIFdvcmxkIQ |
Base64.is | QmFzZTY0Lmlz |
你好 | 5L2g5aW9 |
คำถามที่พบบ่อย
Base64URL เหมือนกับการนำสตริง Base64 ไปเข้ารหัส URL หรือไม่
+, / และ = เป็น %2B, %2F และ %3D ทำให้สตริงยาวขึ้น ส่วน Base64URL ใช้ชุดตัวอักษรที่ต่างออกไป จึงไม่ต้องแปลงอักขระใด ๆ เลย ทั้งสองรูปแบบใช้แทนกันไม่ได้หากไม่แปลงก่อนBase64URL ควรมีแพดดิงหรือไม่
urlsafe_b64encode ของ Python และตัวเข้ารหัส URL ตามค่าเริ่มต้นของ Java จะเติมแพดดิงให้ หากไม่แน่ใจให้ละไว้ เพราะตัวถอดรหัสนี้รับได้ทั้งสองแบบทำไมตัวถอดรหัส Base64 มาตรฐานจึงปฏิเสธสตริง Base64URL ของฉัน
- และ _ และบางตัวต้องมีแพดดิง ให้สลับอักขระและเติมเครื่องหมาย = จนความยาวเป็นพหุคูณของ 4 หรือถอดรหัสสตริงในหน้านี้แทนจะตรวจสอบ code challenge ของ PKCE ได้อย่างไร
BASE64URL(SHA256(code_verifier)) ที่ไม่มีแพดดิง ถอดรหัสที่นี่โดยใช้เอาต์พุตแบบเลขฐานสิบหก ค่าที่ถูกต้องจะได้ 32 ไบต์พอดี ซึ่งนำไปเปรียบเทียบกับแฮช SHA-256 ของ code verifier ได้