编码与安全指南

Base64、Base64URL 与 JWT:编码不是加密

理解 Base64 与 Base64URL 的字符、补位和 UTF-8 处理,明确 JWT 解码与验签的区别。

Nav Tools ·

Base64 表示的是字节

Base64 把字节表示为可打印的 ASCII 字符。它没有密钥,任何人都能解码,不能用于保护密码或凭据。

hello 的 UTF-8 字节编码后为 aGVsbG8=,末尾的 = 是补位,不属于原文。二进制文件应还原为字节,不能假定解码结果是可读文字。

hello → aGVsbG8=

按协议选择 Base64URL

Base64URL 用 - 和 _ 替代 + 和 /。是否保留补位由具体协议决定;JWT 的各段使用不带补位的 URL 安全编码。

URL 百分号编码是另一种操作,以 %HH 转义字节。两种字符串都可能出现在 URL 中,但 URL 解码和 Base64URL 解码不能互相替代。

Base64:    + / =
Base64URL: - _  (padding depends on the protocol)

中文文本先按 UTF-8 处理

浏览器 btoa 接收的是二进制字符串,不能直接处理任意 Unicode 文本;直接传入中文可能报错。TextEncoder 把文字转为 UTF-8 字节,TextDecoder 把解码字节还原为文字。

本站文本编码按 UTF-8 处理。来源使用其他字符集时,应先确认字符集;Base64 解码成功不代表结果一定是合法文本。

JWT 能解码不代表可信

常见的签名 JWT 为 header.payload.signature。解码前两段可以查看声明,但不验证签名、过期时间、签发方或受众。

HS256 验签需要正确的共享密钥,其他算法有各自的验签过程。不能仅凭解码后的声明进行授权;教程示例应使用测试数据。

参考资料

← 编码与安全指南