如何解码 Base64URL
- 把字符串粘贴到 输入 · Base64。页面打开时已载入一个 URL 安全的示例。
- 在 输出 · 文本 中查看结果。状态行会显示变体(Base64URL 或标准)、解码后的字节数和检测到的类型。如果缺少填充,会提示“已自动补全缺失的填充。”
- 令牌里通常是 JSON,格式化 JSON 会将其缩进显示。
- 对于哈希值、随机 ID 等二进制内容,工具会提示这是二进制数据,并给出对应解码器的链接。
- 用 复制输出 或 下载 获取结果。
要编码,请使用 Base64URL 编码器。要在不解码的情况下把 Base64URL 字符串转换为标准 Base64,请使用 Base64URL 转 Base64。
示例
| Base64URL | 解码结果 | 说明 |
|---|---|---|
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 | {"alg":"HS256","typ":"JWT"} | 典型的 JWT 头部 |
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFkYSIsImFkbWluIjp0cnVlfQ | {"sub":"1234567890","name":"Ada","admin":true} | JWT 载荷;已补全填充 |
c3ViamVjdHM_X2Q | subjects?_d | _ 是 URL 安全版的 / |
8J-Riw | 👋 | - 是 URL 安全版的 + |
E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM | 32 个二进制字节 | SHA-256 哈希,RFC 7636 中的 PKCE 示例 |
对于最后一行的哈希,文本输出没有意义。请在 Base64 转 hex 中打开,以 13 d3 1e 96 ... 的形式查看字节。
填充,以及为什么可以补全
Base64URL 通常不写 =。这不会丢失任何信息:有效字符串的长度一定是 4n、4n + 2 或 4n + 3 个字符,余数会告诉解码器最后一组里有一个还是两个字节。工具会在解码前补上缺失的 =,并在状态行中说明。
长度为 4n + 1 的情况永远不会出现。如果看到错误“长度错误:多了或少了一个字符”,说明复制该值时丢失或多出了一个字符,例如在邮件或日志的换行处。填充详解 给出了具体的计算过程。
很多标准解码器没有这么宽容。浏览器中的 atob() 遇到 - 和 _ 会抛出 InvalidCharacterError,Python 的 base64.urlsafe_b64decode 在缺少 = 时会抛出 Incorrect padding。
令牌、Cookie 和 URL 参数
- JWT。 令牌形如
xxxxx.yyyyy.zzzzz。前两部分是 Base64URL 编码的 JSON,第三部分是签名,属于二进制数据。可以在这里逐段解码,也可以把整个令牌粘贴到 JWT 解码器,它还会显示过期时间并验证签名。JWT 中的 Base64 讲解了这种格式。 - Cookie 和会话 ID。 一些框架的会话 Cookie(例如 Flask)用点号把 Base64URL 数据和签名连在一起。只解码数据部分即可。
- URL 参数。 OAuth 的
state、重定向目标和分享链接有时会携带 Base64URL 编码的 JSON。如果值中包含%2F或%2B,说明它外面还套了一层百分号编码,需要先做 URL 解码。
如果字符串中 - 或 _ 与 + 或 / 混用,解码器会停下并提示“输入混用了标准(+ /)和 URL 安全(- _)字符”。这通常说明两个值被拼在了一起,或者某个值只转换了一部分。
在代码中解码 Base64URL
// Node.js
Buffer.from("c3ViamVjdHM_X2Q", "base64url").toString("utf8"); // "subjects?_d"
// Browsers with Uint8Array.fromBase64
new TextDecoder().decode(Uint8Array.fromBase64("c3ViamVjdHM_X2Q", { alphabet: "base64url" }));
import base64
def b64url_decode(s: str) -> bytes:
return base64.urlsafe_b64decode(s + "=" * (-len(s) % 4))
b64url_decode("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9") # b'{"alg":"HS256","typ":"JWT"}'
补填充的那一行适用于任何合法的 Base64 长度。详见 Node.js 中的 Base64、JavaScript 和 Python。
常见问题
怎么解码 Base64URL?
粘贴到上方即可,不需要任何设置。在代码中,把 - 换成 +、_ 换成 /,补上 = 直到长度是 4 的倍数,再按普通 Base64 解码;或者使用 URL 安全的解码器,例如 Node 的 Buffer.from(s, "base64url")。
为什么提示字符“.”有错误?
你粘贴的是整个 JWT。它的三个部分用点号分隔,每一部分都要单独解码。请只粘贴其中一部分,或者用 JWT 解码器 解码完整令牌。
为什么我的 Base64URL 字符串在状态行中显示为标准?
该字符串中没有 -、_、+ 或 /,因此在两种字母表中都有效,不管按哪种解码结果都一样。很多 JWT 头部都是这样。
值仍然带有百分号编码怎么办?
编码过的 =(%3D)会被自动处理。其他转义序列(例如 %2F)说明该值经过了 URL 编码,请先用 URL 解码器 处理。