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

แปลงข้อความ ไบต์เลขฐานสิบหก หรือไฟล์เป็น Base64 แบบปลอดภัยสำหรับ URL และแปลงกลับ ชุดตัวอักษรใช้ - และ _ แทน + และ / และปิดแพดดิงไว้โดยค่าเริ่มต้น เช่นเดียวกับใน JSON Web Token และ OAuth PKCE

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

วิธีใช้งาน

  1. เลือก “เข้ารหัส” หรือ “ถอดรหัส” โดย “รูปแบบ” ถูกตั้งเป็นแบบปลอดภัยสำหรับ URL ไว้แล้ว และปิด “แพดดิง” ไว้
  2. พิมพ์หรือวางข้อความ ป้อนไบต์เลขฐานสิบหก หรือเปิดไฟล์ ผลลัพธ์จะอัปเดตทันทีขณะที่คุณพิมพ์
  3. เปิด “แพดดิง” เฉพาะเมื่อระบบปลายทางต้องการเครื่องหมาย = ต่อท้าย
  4. กด “คัดลอก” หรือ “ดาวน์โหลด” เพื่อรับผลลัพธ์

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.isQmFzZTY0Lmlz
你好5L2g5aW9

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

Base64URL เหมือนกับการนำสตริง Base64 ไปเข้ารหัส URL หรือไม่
ไม่เหมือน การเข้ารหัสแบบเปอร์เซ็นต์ให้ Base64 มาตรฐานจะเปลี่ยน +, / และ = เป็น %2B, %2F และ %3D ทำให้สตริงยาวขึ้น ส่วน Base64URL ใช้ชุดตัวอักษรที่ต่างออกไป จึงไม่ต้องแปลงอักขระใด ๆ เลย ทั้งสองรูปแบบใช้แทนกันไม่ได้หากไม่แปลงก่อน
Base64URL ควรมีแพดดิงหรือไม่
ขึ้นอยู่กับฝั่งที่นำไปใช้ JWT, JSON Web Key และ PKCE กำหนดให้ละแพดดิง ขณะที่ urlsafe_b64encode ของ Python และตัวเข้ารหัส URL ตามค่าเริ่มต้นของ Java จะเติมแพดดิงให้ หากไม่แน่ใจให้ละไว้ เพราะตัวถอดรหัสนี้รับได้ทั้งสองแบบ
ทำไมตัวถอดรหัส Base64 มาตรฐานจึงปฏิเสธสตริง Base64URL ของฉัน
ตัวถอดรหัสมาตรฐานแบบเข้มงวดไม่รับ - และ _ และบางตัวต้องมีแพดดิง ให้สลับอักขระและเติมเครื่องหมาย = จนความยาวเป็นพหุคูณของ 4 หรือถอดรหัสสตริงในหน้านี้แทน
จะตรวจสอบ code challenge ของ PKCE ได้อย่างไร
ค่า challenge คือ BASE64URL(SHA256(code_verifier)) ที่ไม่มีแพดดิง ถอดรหัสที่นี่โดยใช้เอาต์พุตแบบเลขฐานสิบหก ค่าที่ถูกต้องจะได้ 32 ไบต์พอดี ซึ่งนำไปเปรียบเทียบกับแฮช SHA-256 ของ code verifier ได้