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 哈希值进行比对。