无需登录 数据私有 本地保存

Base64URL编码解码 - URL安全的Base64变体

29
0
0
0

Base64URL 编码解码

URL安全的Base64变体 · 适用于JWT、OAuth、URL参数等场景

RFC 4648 §5 实时转换
示例: 中英混合 URL参数 JWT Header 标准Base64
字符: 0 | 字节: 0
检测到JWT格式! 点击快速解码各部分:
✓ 已复制!
字符: 0
Base64URL 将标准Base64中的 + 替换为 -/ 替换为 _,并省略末尾填充等号,使其可在URL中安全传输。

常见问题与知识点

Base64URL 是 Base64 编码的一种 URL 安全变体,定义于 RFC 4648 第5节。它与标准 Base64 的核心区别在于字符映射和填充策略:

特性标准 Base64Base64URL
第62个字符+(加号)-(减号)
第63个字符/(斜杠)_(下划线)
填充字符=(保留)通常省略(可选保留)
URL安全性需要百分号编码可直接用于URL

由于 + 在URL中表示空格,/ 是路径分隔符,= 用于键值分隔,因此标准 Base64 在URL中使用时需要进行百分号编码。Base64URL 通过替换这些字符彻底解决了这个问题。

  • JWT (JSON Web Token):JWT 的三个部分(Header、Payload、Signature)全部使用 Base64URL 编码,是 Base64URL 最经典的应用。
  • OAuth 2.0 / OpenID Connect:授权码、ID Token、Access Token 等常使用 Base64URL 编码。
  • URL 参数传递二进制数据:如图片缩略图的 data URI、文件哈希值作为查询参数。
  • Web Crypto API:浏览器原生加密API的导出格式常使用 Base64URL。
  • DNS TXT 记录:如 DKIM 签名、DMARC 策略中的公钥数据。

Base64(包括 Base64URL)的原理是将每 3个字节(24位) 的二进制数据映射为 4个ASCII字符。因此编码后的长度大约是原始字节长度的 4/3 ≈ 133.3%,即膨胀约 33%。

例如:原始数据 300 字节 → 编码后约 400 个字符(不含填充)。虽然 Base64URL 省略了末尾的 = 填充,但主体部分的长度膨胀比例不变。

编码:

function base64urlEncode(str) {
  // 使用 TextEncoder 处理 Unicode
  const bytes = new TextEncoder().encode(str);
  const binStr = String.fromCharCode(...bytes);
  const b64 = btoa(binStr);
  return b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}

解码:

function base64urlDecode(b64url) {
  // 还原为标准 Base64
  let b64 = b64url.replace(/-/g, '+').replace(/_/g, '/');
  // 补齐填充等号
  while (b64.length % 4) b64 += '=';
  const binStr = atob(b64);
  const bytes = Uint8Array.from(binStr, c => c.charCodeAt(0));
  return new TextDecoder().decode(bytes);
}

💡 本工具的核心逻辑即基于以上实现。

可以省略,且推荐省略。RFC 4648 明确指出,在已知编码数据长度的上下文中,填充等号不是必需的。Base64URL 的设计目标之一就是消除URL中的特殊字符,因此实践中(如JWT)几乎总是省略填充。

解码时,只需在将 Base64URL 还原为标准 Base64 后,根据字符串长度补充等号

  • 长度 % 4 = 0 → 无需补充
  • 长度 % 4 = 2 → 补充 ==
  • 长度 % 4 = 3 → 补充 =
  • 长度 % 4 = 1 → 无效的 Base64 字符串

Base64URL 不是加密,而是编码。它只是一种数据表示形式,将二进制数据转换为可打印的ASCII字符。任何人拿到 Base64URL 字符串都可以直接解码还原原始数据。

如果需要保护数据安全,应该在 Base64URL 编码之前先使用真正的加密算法(如 AES、RSA)进行加密。JWT 中的签名(Signature)部分即是对前两部分签名后的 Base64URL 编码,用于验证数据完整性,而非保密数据内容。

JWT(JSON Web Token)格式为 header.payload.signature,三个部分均由 Base64URL 编码。本工具可以解码任意一个部分:

  1. 复制 JWT 中任意一个部分(如中间的 payload)
  2. 粘贴到输入框,选择「解码」模式
  3. 即可看到解码后的 JSON 内容

💡 如果粘贴完整的 JWT(含两个点号),工具会自动检测并提示快速解码 Payload。