Base64URL 編碼解碼

將文字、十六進位位元組或檔案轉換為 URL 安全的 Base64,也可以反向解碼。字母表用 - 和 _ 代替 + 和 /,並預設關閉填充,與 JSON Web Token 和 OAuth PKCE 的用法一致。

完全在瀏覽器中執行,不會上傳任何資料。

使用方法

  1. 選擇「編碼」或「解碼」。本頁已預選 URL 安全變體,並關閉了填充。
  2. 輸入或貼上文字、十六進位位元組,或者開啟檔案,結果會隨輸入即時更新。
  3. 只有當接收方要求末尾帶 = 時,才需要開啟「填充」。
  4. 複製結果,或將結果下載為檔案。

什麼是 Base64URL?

Base64URL 由 RFC 4648 第 5 節定義,全稱是「使用 URL 和檔名安全字母表的 Base64 編碼」。它的原理與標準 Base64 完全相同,每個字元承載 6 位,只是替換了在 URL 和檔案路徑中容易出問題的兩個字元:

標準 Base64Base64URL
數值 62+-
數值 63/_
填充=,必需通常省略

在 URL 中,+ 可能被當成空格,/ 用來分隔路徑,= 用來分隔查詢參數的鍵和值,所以標準 Base64 放進連結之前必須先做百分號編碼,而 Base64URL 無需任何轉義。RFC 4648 允許在長度可由上下文確定時省略填充,大多數基於 Base64URL 的規範也正是這樣做的。

Base64URL 的常見用途

  • JSON Web Token。JWT 的頭部、載荷和簽名都是不帶填充的 Base64URL(RFC 7515)。可以用 JWT 解碼 工具檢視其內容。
  • OAuth 2.0 PKCE。code_challenge 是 code verifier 的 SHA-256 雜湊值經過無填充 Base64URL 編碼的結果(RFC 7636),因此長度固定為 43 個字元。
  • JSON Web Key 和 WebAuthn。n、e、x、y 等金鑰參數,以及 WebAuthn 的 challenge 和憑據 ID,都以 Base64URL 形式傳遞。
  • 權杖、ID 和檔名。密碼重置連結、簽名 URL 和快取鍵都可以直接攜帶 Base64URL,16 位元組的隨機 ID 只需 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 - _
輸出體積每 3 位元組輸出 4 個字元(約 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 都要求省略填充,而 Python 的 urlsafe_b64encode 和 Java 預設的 URL 編碼器會加上填充。拿不準時建議省略,本工具解碼時兩種形式都接受。
為什麼標準 Base64 解碼器無法解析我的 Base64URL 字串?
嚴格的標準解碼器不接受 - 和 _,有些還要求必須有填充。可以先替換字元並補上 = 使長度為 4 的整數倍,或者直接在本頁解碼。
如何檢查 PKCE 的 code challenge?
challenge 的計算方式是 BASE64URL(SHA256(code_verifier)),不帶填充。在本頁解碼並選擇十六進位輸出,正確的值應當正好是 32 個位元組,可以與 verifier 的 SHA-256 雜湊值進行比對。