ToolDeck

Base64 ปลอดภัยสำหรับ URL

เข้ารหัสและถอดรหัส Base64 ปลอดภัยสำหรับ URL (Base64url)

ข้อความธรรมดา

Base64

ประมวลผลในเครื่อง · ปลอดภัยในการวางข้อมูลลับ
เอาต์พุต Base64...

การเข้ารหัส Base64url คืออะไร?

Base64url คือรูปแบบหนึ่งของการเข้ารหัส Base64 ที่ออกแบบมาโดยเฉพาะสำหรับใช้งานใน URL, ชื่อไฟล์ และบริบทอื่นๆ ที่อักขระมาตรฐาน Base64 อย่าง + และ / ทำให้เกิดปัญหา กำหนดไว้ใน RFC 4648 ส่วนที่ 5, Base64url แทนที่ + ด้วย - (ยัติภังค์) และ / ด้วย _ (ขีดล่าง) และละเว้นอักขระ padding = ท้ายสตริง ผลลัพธ์คือสตริงที่สามารถฝังโดยตรงใน URL query parameter, ชื่อไฟล์ หรือ HTTP header โดยไม่ต้องเข้ารหัสเปอร์เซ็นต์เพิ่มเติม

Base64 มาตรฐาน (RFC 4648 ส่วนที่ 4) ใช้อักขระ 64 ตัว ได้แก่ A-Z, a-z, 0-9, + และ / อักขระ + และ / มีความหมายพิเศษใน URL: + จะถูกตีความเป็นช่องว่างใน query string (application/x-www-form-urlencoded) และ / เป็นตัวคั่นเส้นทาง การใช้ Base64 มาตรฐานภายใน URL จึงต้องเข้ารหัสอักขระเหล่านี้เป็นเปอร์เซ็นต์ (%2B, %2F) ซึ่งทำให้สตริงยาวขึ้นและอ่านยากขึ้น Base64url แก้ปัญหานี้ได้อย่างสมบูรณ์โดยใช้อักขระที่ปลอดภัยสำหรับ URL ตั้งแต่แรก

การใช้งาน Base64url ที่โดดเด่นที่สุดคือใน JSON Web Token (JWT) ทั้งสามส่วนของ JWT — header, payload และ signature — ถูกเข้ารหัสด้วย Base64url OAuth 2.0 PKCE code verifier, WebAuthn challenge value และ API token scheme หลายรูปแบบก็พึ่งพา Base64url เช่นกัน การเข้าใจการเข้ารหัสนี้เป็นสิ่งสำคัญสำหรับนักพัฒนาที่ทำงานกับการยืนยันตัวตน, การอนุญาต หรือการแลกเปลี่ยนข้อมูลแบบเข้ารหัส

ทำไมต้องใช้เครื่องมือ Base64url นี้?

แปลงระหว่าง Base64url กับข้อความหรือข้อมูลไบนารีโดยตรงในเบราว์เซอร์ของคุณ รองรับทั้งการเข้ารหัสและถอดรหัส พร้อมจัดการ padding และการแทนที่อักขระโดยอัตโนมัติ

แปลงทันที
ผลลัพธ์จะอัปเดตขณะที่คุณพิมพ์ เข้ารหัสข้อความเป็น Base64url หรือถอดรหัส Base64url กลับเป็นข้อความโดยไม่มีความล่าช้า ไม่ต้องส่งฟอร์มหรือโหลดหน้าใหม่
🔗
ผลลัพธ์ปลอดภัยสำหรับ URL
ผลลัพธ์ใช้เฉพาะอักขระที่ปลอดภัยใน URL, ชื่อไฟล์ และ HTTP header ได้แก่ A-Z, a-z, 0-9, ยัติภังค์ และขีดล่าง ไม่ต้องเข้ารหัสเปอร์เซ็นต์
🔒
ประมวลผลแบบให้ความเป็นส่วนตัวก่อน
การเข้ารหัสและถอดรหัสทั้งหมดทำงานในเบราว์เซอร์ของคุณ JWT token, OAuth secret และ API key ที่คุณวางที่นี่จะไม่ถูกส่งไปยังเซิร์ฟเวอร์ใดๆ
🏛️
เป็นไปตามมาตรฐาน
ปฏิบัติตาม RFC 4648 ส่วนที่ 5 อย่างครบถ้วน: - และ _ แทนที่ + และ / และละเว้น padding รองรับ JWT library, OAuth 2.0 PKCE และการปรับใช้งาน WebAuthn

กรณีการใช้งาน Base64url

การตรวจสอบ JWT Token
ถอดรหัสส่วนต่างๆ ของ JWT (header, payload) เพื่อตรวจสอบ claim, เวลาหมดอายุ และอัลกอริทึมการลงนาม โดยไม่ต้องนำเข้า JWT library หรือตรวจสอบ signature
OAuth 2.0 PKCE Flow
สร้างและตรวจสอบค่า PKCE code_verifier และ code_challenge โดย code_challenge_method S256 ต้องการ SHA-256 hash ของ code_verifier ที่เข้ารหัสด้วย Base64url
การผสานรวม WebAuthn / FIDO2
WebAuthn challenge, credential ID และข้อมูล attestation ถูกส่งเป็นสตริง Base64url ระหว่างเบราว์เซอร์กับเซิร์ฟเวอร์ผู้พึ่งพา ถอดรหัสเพื่อแก้ไขข้อบกพร่องในกระบวนการลงทะเบียนและการยืนยันตัวตน
การสร้าง API Token
สร้าง token ที่ปลอดภัยสำหรับ URL จากไบต์สุ่มสำหรับลิงก์รีเซ็ตรหัสผ่าน, การยืนยันอีเมล และ session identifier Base64url ผลิตสตริงขนาดกะทัดรัดที่ใช้งานได้ใน URL โดยไม่ต้องกำหนด escape
DevOps และ CI/CD Pipeline
จัดเก็บค่าการกำหนดค่าแบบไบนารี (certificate, key) เป็นสตริง Base64url ในตัวแปรสภาพแวดล้อมหรือไฟล์ YAML ต่างจาก Base64 มาตรฐาน ผลลัพธ์ไม่มีอักขระที่ขัดแย้งกับการขยาย shell หรือไวยากรณ์ YAML
วิศวกรรมข้อมูล
เข้ารหัส identifier แบบไบนารี, hash หรือ checksum เป็น Base64url สำหรับใช้ในชื่อไฟล์, database key หรือคอลัมน์ CSV ที่อักขระ + และ / จะทำให้การแยกวิเคราะห์ผิดพลาดหรือต้องกำหนด escape

Base64 มาตรฐาน เทียบกับ Base64url

Base64url แตกต่างจาก Base64 มาตรฐานใน 3 ประเด็นเท่านั้น อัลกอริทึมการเข้ารหัสเหมือนกัน — เปลี่ยนเพียง alphabet และพฤติกรรม padding:

คุณสมบัติมาตรฐาน (RFC 4648 §4)Base64url (RFC 4648 §5)
Index 62+-
Index 63/_
Padding= (required)Omitted

ความแตกต่าง 3 ประการนี้หมายความว่าการแปลงระหว่าง Base64 มาตรฐานกับ Base64url เป็นเรื่องง่าย: แทนที่ + ด้วย -, / ด้วย _ และลบอักขระ = ท้ายสตริง ในทางกลับกัน แทนที่ - ด้วย +, _ ด้วย / และเพิ่ม padding กลับเพื่อให้ความยาวเป็นทวีคูณของ 4 ภาษาส่วนใหญ่มีการรองรับ Base64url ในตัว ทำให้ไม่จำเป็นต้องแปลงด้วยตนเอง

ตารางเปรียบเทียบการเข้ารหัส

ตารางด้านล่างแสดงข้อมูล input เดียวกันที่เข้ารหัสด้วย Base64 มาตรฐานและ Base64url สังเกตว่าอักขระ padding (=) ถูกลบออก และ + / / ถูกแทนที่ด้วย - / _ ในรูปแบบที่ปลอดภัยสำหรับ URL:

InputBase64 มาตรฐานBase64url (ไม่มี padding)
HelloSGVsbG8=SGVsbG8
AQQ==QQ
1+1=2MSsxPTI=MSsxPTI
subject?ref=1c3ViamVjdD9yZWY9MQ==c3ViamVjdD9yZWY9MQ
👍 (thumbs up)8J+RjQ==8J-RjQ

ตัวอย่างโค้ด

วิธีเข้ารหัสและถอดรหัสสตริง Base64url ในภาษายอดนิยม ทุกตัวอย่างผลิตผลลัพธ์ที่ปลอดภัยสำหรับใช้ใน URL, ชื่อไฟล์ และ HTTP header:

JavaScript (browser)
// Encode to Base64url
function toBase64url(str) {
  return btoa(unescape(encodeURIComponent(str)))
    .replace(/\+/g, '-')
    .replace(/\//g, '_')
    .replace(/=+$/, '')
}
toBase64url('Hello!') // → "SGVsbG8h"

// Decode from Base64url
function fromBase64url(b64url) {
  const b64 = b64url.replace(/-/g, '+').replace(/_/g, '/')
  const pad = (4 - b64.length % 4) % 4
  return decodeURIComponent(escape(atob(b64 + '='.repeat(pad))))
}
fromBase64url('SGVsbG8h') // → "Hello!"
Node.js
// Native base64url support since Node 15.7
const encoded = Buffer.from('Hello!').toString('base64url')
// → "SGVsbG8h"

const decoded = Buffer.from('SGVsbG8h', 'base64url').toString()
// → "Hello!"

// Decode a JWT payload
const jwt = 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0...'
const payload = JSON.parse(Buffer.from(jwt.split('.')[1], 'base64url').toString())
// → { sub: "1234567890" }
Python
import base64

# Encode to Base64url (no padding)
encoded = base64.urlsafe_b64encode(b'Hello!').rstrip(b'=').decode()
# → "SGVsbG8h"

# Decode from Base64url (re-add padding)
def b64url_decode(s: str) -> bytes:
    s += '=' * (4 - len(s) % 4)  # restore padding
    return base64.urlsafe_b64decode(s)

b64url_decode('SGVsbG8h')  # → b'Hello!'
Go
package main

import (
    "encoding/base64"
    "fmt"
)

func main() {
    // Encode to Base64url (no padding)
    encoded := base64.RawURLEncoding.EncodeToString([]byte("Hello!"))
    fmt.Println(encoded) // → "SGVsbG8h"

    // Decode from Base64url
    decoded, _ := base64.RawURLEncoding.DecodeString("SGVsbG8h")
    fmt.Println(string(decoded)) // → "Hello!"
}

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

ความแตกต่างระหว่าง Base64 กับ Base64url คืออะไร?
Base64url แทนที่ + ด้วย - และ / ด้วย _ จาก alphabet Base64 มาตรฐาน และละเว้นอักขระ padding = ท้ายสตริง ทำให้ผลลัพธ์ปลอดภัยสำหรับใช้ใน URL, query parameter, ชื่อไฟล์ และ HTTP header โดยไม่ต้องเข้ารหัสเพิ่มเติม อัลกอริทึมพื้นฐาน (แบ่งไบต์เป็นกลุ่ม 6 บิตที่แมปกับอักขระ ASCII) เหมือนกัน
ทำไม JWT token จึงใช้ Base64url แทน Base64 มาตรฐาน?
JWT มักถูกส่งใน URL query parameter และ HTTP Authorization header อักขระ + และ / ของ Base64 มาตรฐานต้องถูกเข้ารหัสเปอร์เซ็นต์ใน URL ซึ่งเพิ่มความยาวและทำให้การเปรียบเทียบสตริงง่ายๆ ผิดพลาด ข้อกำหนด JWT (RFC 7519) กำหนดให้ใช้ Base64url โดยไม่มี padding เพื่อให้ token กะทัดรัดและปลอดภัยสำหรับ URL โดยค่าเริ่มต้น
ฉันจะแปลง Base64 มาตรฐานเป็น Base64url ได้อย่างไร?
แทนที่ + ทุกตัวด้วย -, / ทุกตัวด้วย _ และลบอักขระ = ท้ายสตริงทั้งหมด ใน JavaScript: base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '') ใน Python: base64.urlsafe_b64encode(data).rstrip(b'=') ภาษาสมัยใหม่ส่วนใหญ่มีฟังก์ชันเข้ารหัส Base64url โดยเฉพาะ
การเข้ารหัส Base64url สามารถย้อนกลับได้หรือไม่?
ได้ Base64url สามารถย้อนกลับได้อย่างสมบูรณ์ ในการถอดรหัส ให้แทนที่ - ด้วย + และ _ ด้วย /, เพิ่ม padding = กลับเพื่อให้ความยาวเป็นทวีคูณของ 4 จากนั้นถอดรหัสเป็น Base64 มาตรฐาน ผลลัพธ์ที่ถอดรหัสแล้วเหมือนกับ input ต้นฉบับทุกไบต์
ฉันสามารถใช้ Base64url เพื่อเข้ารหัสข้อมูลได้หรือไม่?
ไม่ได้ Base64url เป็นการเข้ารหัส ไม่ใช่การเข้ารหัสแบบรักษาความลับ มันแปลงข้อมูลไบนารีเป็นรูปแบบที่ปลอดภัยสำหรับข้อความโดยไม่มีการปิดบัง ทุกคนสามารถถอดรหัสได้ หากคุณต้องการปกป้องข้อมูล ให้เข้ารหัสด้วยอัลกอริทึมที่เหมาะสม (AES, ChaCha20) ก่อน จากนั้น Base64url-encode ciphertext สำหรับการส่ง
ทำไม Base64url จึงละเว้น padding?
อักขระ padding (=) ไม่มีประโยชน์เมื่อตัวถอดรหัสสามารถคำนวณจำนวนไบต์ที่ขาดจากความยาวสตริงได้: (4 - length % 4) % 4 ให้จำนวน padding ที่ต้องการ การละเว้น padding ทำให้สตริงสั้นลงและหลีกเลี่ยงอักขระ = ที่ต้องถูกเข้ารหัสเปอร์เซ็นต์ใน URL RFC 4648 ส่วนที่ 5 อนุญาตให้ละเว้น padding ใน Base64url อย่างชัดเจน
ฉันจะจัดการสตริง Base64url ที่มี padding ในโค้ดของฉันได้อย่างไร?
บางระบบผลิตสตริง Base64url ที่ยังมี padding = ตัวถอดรหัสส่วนใหญ่จัดการได้อย่างถูกต้อง หากตัวถอดรหัสของคุณทำไม่ได้ ให้ลบ = ท้ายสตริงก่อนถอดรหัส ในทางกลับกัน หาก library ต้องการ padding ให้คำนวณและเติมกลับ: const padded = str + '='.repeat((4 - str.length % 4) % 4) วิธีนี้ได้ผลเพราะจำนวน padding สามารถกำหนดได้จากความยาวสตริง