1. 引言
数据的基数编码在许多场景下用于在被限制为 US-ASCII [1] 数据的环境中存储或传输数据,这种限制或许出于历史原因。基数编码也可用于没有历史限制的新应用,仅仅是因为它使得用文本编辑器操作对象成为可能。
过去,不同应用有不同的需求,因此有时会以略微不同的方式实现基数编码。如今,协议规范有时会泛泛地使用基数编码,尤其是 "base64",却没有精确的描述或引用。多用途互联网邮件扩展(MIME)[4] 常被作为 base64 的参考,却未考虑其对换行或字母表外字符的影响。本规范的目的是确立通用的字母表与编码考量。这将有望减少其他文档中的歧义,从而带来更好的互操作性。
为什么需要基数编码
核心问题
许多历史系统与原生协议只能处理文本数据(US-ASCII),无法直接传输二进制数据:
问题场景:
❌ 电子邮件系统(SMTP)——仅支持 7 位 ASCII
❌ URL 参数——某些字符具有特殊含义
❌ JSON/XML——无法直接嵌入二进制数据
❌ 文本编辑器——无法编辑二进制文件
基数编码解决方案
二进制数据 → 基数编码 → 文本数据
(不可打印) (转换) (可打印、可传输)
示例:
原始数据:[0x48, 0x65, 0x6C, 0x6C, 0x6F] (二进制)
Base64: "SGVsbG8=" (文本)
历史背景与互操作性问题
实现差异引发的问题
在 Base64 标准化之前,不同实现之间存在差异:
| 实现 | 行长度限制 | 填充规则 | 字母表 |
|---|---|---|---|
| MIME | 76 字符 | 必需 | 标准 |
| PEM | 64 字符 | 必需 | 标准 |
| 某些 URL 编码 | 无限制 | 可选 | URL 安全 |
这些差异导致了:
- ❌ 跨系统数据交换失败
- ❌ 解码错误
- ❌ 安全漏洞
RFC 4648 的价值
本规范通过以下方式解决这些问题:
- 统一字母表——明确定义 Base64、Base32、Base16 的标准字母表
- 清晰规则——规定如何处理换行、填充、非法字符
- 提供变体——定义 URL 安全的 Base64 变体
- 互操作性——确保不同实现之间的兼容性
适用场景
Base64 的典型应用
1. 电子邮件附件(MIME)
Content-Transfer-Encoding: base64
2. Data URI
data:image/png;base64,iVBORw0KGgo...
3. JWT 令牌
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
4. HTTP 基本认证
Authorization: Basic dXNlcjpwYXNz
5. 在 XML/JSON 中嵌入二进制数据
{"avatar": "SGVsbG8gV29ybGQ="}
为什么不直接传输二进制?
原因:
1. 协议限制——SMTP、HTTP 头部仅支持 ASCII
2. 文本安全性——避免控制字符引发的问题
3. 可编辑性——可用文本编辑器查看与修改
4. 兼容性——跨平台、跨系统传输更可靠
本规范的目标
RFC 4648 旨在:
✅ 消除歧义——提供清晰、无歧义的编码定义
✅ 提升互操作性——确保不同实现之间的兼容
✅ 提供选择——为不同场景提供合适的编码变体
✅ 安全考量——明确规定与安全相关的实现要求
后续步骤
后续章节将详细讲述:
- 第 2 节:RFC 2119 关键词的使用约定
- 第 3 节:实现差异与推荐行为
- 第 4–8 节:各类基数编码的详细规范
- 第 9–10 节:示例与测试向量
- 第 12 节:安全注意事项