什么是 Base64?

Base64 是一种将二进制数据转换为 ASCII 字符串的编码算法。它使用 64 个可打印字符(A-Z、a-z、0-9、+、/)以及 = 作为填充符,广泛用于在文本协议中传输二进制数据。

Base64 编码原理

核心步骤

  1. 将每 3 个字节(24 bit)的二进制数据分成 4 组,每组 6 bit
  2. 每组 6 bit 映射到一个 Base64 字符(0-63 对应 64 个可打印字符)
  3. 如果最后一组不足 3 字节,用 = 填充

编码示例

假设要编码文本 Man

  1. ASCII 值:M=77, a=97, n=110
  2. 二进制:01001101 01100001 01101110
  3. 分组(6 bit):010011 010110 000101 101110
  4. 十进制:19, 22, 5, 46
  5. 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 的倍数。