正在加载,请稍候…

Base64 编码详解:原理与使用场景

了解 Base64 编码是什么、算法如何工作、在 Web 开发中的常见用途(数据 URI、JWT),以及如何在线编码/解码字符串和文件。

Base64 编码详解:原理与使用场景

什么是 Base64 编码?

Base64 是一种编码方案,它使用 64 个字符的字母表(A-Z、a-z、0-9、+、/)将二进制数据转换为文本格式。它不是加密——不提供任何安全性——但它是通过纯文本通道传输二进制数据的通用解决方案。

Base64 编码详解:原理与使用场景 插图

为什么需要 Base64

最初的互联网协议(SMTP、HTTP/1.0、JSON)是为 7 位 ASCII 文本设计的。二进制数据——图像、文件、加密密钥——无法通过这些通道安全传输,因为:

  • 某些字节值具有特殊含义(空字节、换行符、控制字符)
  • 某些系统会剥离或转换高位字符
  • 二进制数据可能包含类似协议命令的序列

Base64 通过将任何二进制数据转换为安全的可打印 ASCII 字符子集来解决这个问题。

Base64 字符集

标准 Base64 使用 64 个可打印字符:

  • A-Z(26 个字符)
  • a-z(26 个字符)
  • 0-9(10 个字符)
    • 和 /(2 个字符)
  • = 用于填充

这个 64 字符集可以用每个字符 6 位表示(2^6 = 64)。

Base64 编码如何工作

Base64 将 3 个字节(24 位)转换为 4 个字符(4 × 6 位 = 24 位):

  1. 取 3 个字节:01001101 01100001 01101110("Man")
  2. 分组为 6 位块:010011 010110 000101 101110
  3. 映射到 Base64 字符:T W F u
  4. 结果:"TWFu"

当输入不能被 3 整除时,添加 = 填充:

  • 1 个额外字节 → 2 个字符 + "=="
  • 2 个额外字节 → 3 个字符 + "="

大小开销

Base64 将数据大小增加约 33%:

  • 3 字节输入 → 4 字节输出(比例 = 1.333...)
  • 1 MB 文件作为 Base64 变为约 1.37 MB

如果包含换行符(MIME 要求每行 76 个字符),开销增加到约 37%。

Base64 变体

Base64 编码详解:原理与使用场景 插图

标准 Base64(RFC 4648)

使用 + 和 /。使用 = 填充。用于 MIME 电子邮件、数据 URI。

URL 安全 Base64(RFC 4648 §5)

将 + 替换为 -,将 / 替换为 _,以避免 URL 编码冲突。用于 JWT 令牌、URL 参数、文件名。

无填充 Base64

某些系统(如许多 JWT 实现)省略 = 填充。解码器必须处理这种情况。

MIME Base64

标准 Base64 加上每 76 个字符的换行符(\r\n)。用于电子邮件附件。

Base64 的常见用途

Base64 编码详解:原理与使用场景 插图

数据 URL(CSS/HTML)

将小图像直接嵌入 CSS 或 HTML,无需单独文件:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUg..." />

JWT 令牌

JWT 的三个部分(头部、载荷、签名)都使用 Base64URL 编码。

API 认证

HTTP Basic Auth 将凭据编码为 Base64:

Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

加密密钥

PEM 格式(用于 SSL 证书、SSH 密钥)包装 Base64 编码的 DER 二进制数据:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
-----END PUBLIC KEY-----

电子邮件附件(MIME)

所有电子邮件附件在 MIME 多部分格式中都是 Base64 编码的。

在 JavaScript 和 Python 中解码

// 编码
const encoded = btoa('Hello, World!');  // 'SGVsbG8sIFdvcmxkIQ=='
// 解码
const decoded = atob('SGVsbG8sIFdvcmxkIQ==');  // 'Hello, World!'
// 对于二进制数据,使用 Uint8Array 方法
import base64
encoded = base64.b64encode(b'Hello, World!').decode()  # 'SGVsbG8sIFdvcmxkIQ=='
decoded = base64.b64decode('SGVsbG8sIFdvcmxkIQ==')  # b'Hello, World!'

使用 Base64 字符串转换器

我们的工具:

  1. 编码文本或数据 — 将任何字符串转换为 Base64
  2. 解码 Base64 — 从编码字符串恢复原始内容
  3. 选择变体 — 标准、URL 安全或 MIME(带换行符)
  4. Unicode 支持 — 使用 UTF-8 正确处理非 ASCII 文本
  5. 复制结果 — 一键复制编码/解码输出

用于生成数据 URL、调试 JWT 内容、编码 API 凭据以及理解 Web 应用程序中的 Base64 编码数据。