使用方法
- 选择“编码”或“解码”。本页已预选 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 哈希值进行比对。