Base64、Base64URL 和 Base32:协议选择清单

比较六位与五位编码、大小写、填充和人工抄录需求,再选择合适格式。

这三种名称都属于二进制到文本的表示方案,但约束不同。Base64 与 Base64URL 按六位分组,标准 Base32 按五位分组,使用更小的字母表。应选择传输、存储和接收程序都能完整保存的格式。

先比较字母表,再比较长度

标准 Base64 使用大小写字母、数字、加号和斜杠,Base64URL 把最后两个字符替换为连字符和下划线,两者都区分大小写。RFC Base32 使用大写 A–Z 和数字 2–7。解码器可能兼容小写,但协议应明确接受规则和规范输出。

不区分大小写的渠道可能破坏 Base64,却能保存规则明确的 Base32。URL 令牌与电话口述代码的约束不同,不能只看示例是否短。

理解长度代价

忽略末组后,Base64 每字节约需 1.33 个字符,Base32 约需 1.6 个。标准 Base32 每五字节形成八字符组。单字节 f 的常见向量分别为 Base64 的 Zg== 和 Base32 的 MY======。短输入的填充比例很高,应使用真实负载比较。

原始字节: 66(ASCII f)
Base64:   Zg==
Base64URL:Zg==,协议允许省略填充时为 Zg
RFC Base32:MY======

不要混用 Base32 变体

Crockford Base32 面向人工读取的标识符,字母表与歧义处理规则不同于 RFC Base32;Base32hex 也不相同。文档必须写明变体、字母表、填充与校验规则。

编码不提供认证。输错后的字符串可能仍然语法合法,只是解码为另一组字节。需要人工抄录时,应考虑协议规定的校验步骤,而不是假定字母表能发现所有错误。

写清完整约定

约定字节顺序、空输入、前导零、最大长度、空白和非法字符处理。测试向量应包含高位字节与不足整组的输入。分别用独立参考验证编码器和解码器,避免两端相同错误造成“往返成功”的假象。标准形式与向量见 RFC 4648。