什么是 Base64?
Base64 是一种将二进制数据转换为 ASCII 字符串的编码算法。它使用 64 个可打印字符(A-Z、a-z、0-9、+、/)以及 = 作为填充符,广泛用于在文本协议中传输二进制数据。
Base64 编码原理
核心步骤
- 将每 3 个字节(24 bit)的二进制数据分成 4 组,每组 6 bit
- 每组 6 bit 映射到一个 Base64 字符(0-63 对应 64 个可打印字符)
- 如果最后一组不足 3 字节,用
=填充
编码示例
假设要编码文本 Man:
- ASCII 值:
M=77,a=97,n=110 - 二进制:
01001101 01100001 01101110 - 分组(6 bit):
010011 010110 000101 101110 - 十进制:19, 22, 5, 46
- Base64 字符:
TWFu
编码膨胀率
Base64 编码会使数据大小增加约 33%(3 字节 → 4 字符)。对于大文件,这个膨胀率是需要考虑的重要因素。
URL 安全的 Base64
标准 Base64 使用 + 和 / 字符,在 URL 中可能引起歧义。URL-safe Base64(RFC 4648 第 5 节)做了以下替代:
+→-/→_- 去掉末尾的
=填充
常见应用场景
1. 电子邮件附件(MIME)
电子邮件系统使用 Base64 编码二进制附件,确保附件在 SMTP 协议中安全传输。
2. JWT Token
JWT 的 Header 和 Payload 使用 Base64 URL-safe 编码。
3. Data URI
在 HTML/CSS 中嵌入小图片:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...">
4. HTTP Basic 认证
Authorization: Basic base64(username:password)
使用建议
什么时候使用 Base64?
- ✅ 在 JSON 中传输小型二进制数据
- ✅ 在 URL 中安全地传递数据
- ✅ 电子邮件附件
- ❌ 大文件传输(膨胀 33%,建议使用二进制传输)
- ❌ 敏感数据保护(Base64 不是加密)
性能建议
- 浏览器中使用原生 API:
btoa()编码、atob()解码 - Node.js 中使用
Buffer.from()和.toString('base64') - 避免手动实现 Base64 算法
- 对于超过 1MB 的文件,建议使用 Blob URL 而非 Base64
常见问题
Base64 是加密吗?
不是。 Base64 只是编码,任何人都可以解码。不要用 Base64 保护敏感数据。
Base64 编码后的字符串末尾为什么有 =?
= 是填充字符,用于确保编码后的字符串长度是 4 的倍数。