使用方法
- 選擇「編碼」或「解碼」。本頁已預選 URL 安全變體,並關閉了填充。
- 輸入或貼上文字、十六進位位元組,或者開啟檔案,結果會隨輸入即時更新。
- 只有當接收方要求末尾帶 = 時,才需要開啟「填充」。
- 複製結果,或將結果下載為檔案。
什麼是 Base64URL?
Base64URL 由 RFC 4648 第 5 節定義,全稱是「使用 URL 和檔名安全字母表的 Base64 編碼」。它的原理與標準 Base64 完全相同,每個字元承載 6 位,只是替換了在 URL 和檔案路徑中容易出問題的兩個字元:
| 標準 Base64 | Base64URL | |
|---|---|---|
| 數值 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.is | QmFzZTY0Lmlz |
你好 | 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 雜湊值進行比對。