跳到主要内容
ecdsa.com

Base64url

RFC 4648 §5 定义的 URL 和文件名安全的 base64 字母表,用 - 和 _ 替换 + 和 /,在 JOSE 中还会省略 = 填充;JWT 的每个部分都经过 base64url 编码。
其他写法base64urlBase64URLURL-safe base64RFC 4648 section 5

Base64 把每 3 个字节映射为 4 个字符,因此编码后的大小约为输入的 4/3:64 字节的 ES256 签名会变成 86 个字符,256 字节的 RS256 签名会变成 342 个字符。JWS、JWE 和 JWK 使用不带填充的 base64url(RFC 7515 §2),JSON 中 WebAuthn 的 id 和 rawId、DPoP 证明以及 SD-JWT 披露也是如此。PEM 文件和 MIME 使用带填充和换行的标准字母表。

常见错误:用标准 base64 解码器解码 base64url(遇到 - 或 _ 时报错,或不报错却得出错误结果),添加或要求 = 填充,在 PEM 和 JWK 之间转换密钥时混用两种字母表,以及比较编码后的字符串而不是解码后的字节。严格的 JOSE 解析器会拒绝紧凑序列化令牌中的填充和空白字符。

API:Node.js 中用 Buffer.from(s, "base64url") 和 buf.toString("base64url");Python 中用 base64.urlsafe_b64encode(它会保留填充,需要自己去掉);Go 中用 base64.RawURLEncoding;Java 中用 Base64.getUrlEncoder().withoutPadding()。

标准与参考资料

全部术语