Base64 不是加密:它到底是什么?

· 约 2 分钟 🔠 Base64

很多人第一次见到 Base64 以为是一种加密——毕竟看起来都是密密麻麻的乱码。但它不是加密,是编码,任何人都能一眼解出来。理解这个区别,才能正确用它。

编码 vs 加密

  • 编码(Base64):可逆的格式转换,不保密。目的是把二进制”翻译”成纯文本字符
  • 加密(AES 等):需要密钥才能还原的变换,防偷窥

看到的 aGVsbG8gd29ybGQ=——任何在线工具输入就能解出 hello world。别用 Base64 来”藏”密码、API Key 或隐私数据。

原理:3 字节 → 4 字符

Base64 把每 3 字节(24 位) 拆成 4 组 6 位,每组映射到一个字符(64 个可打印字符,所以叫 Base64):

原文:    h       e       l       l       o
二进制:  01101000 01100101 01101100 01101100 01101111
分组 6b: 011010 000110 010101 101100 011011 000110 1111??
查表:    a      G      V      s      b      G      8=

字符集:A-Z a-z 0-9 + /,共 64 个。末尾不足 3 字节时用 = 填充。

为什么会膨胀 33%

每 3 字节(24 位)变成 4 字节(32 位),4/3 ≈ 1.33输出永远比输入大三分之一。100KB 的图片 Base64 后约 133KB。

最常见的三种场景

1. 在文本协议里传二进制 邮件(MIME)、JSON、URL 这些协议设计时假设数据是纯文本,传二进制会出问题。Base64 把图片、加密数据塞进 JSON 字段。

2. data URL(内嵌小图标)

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

省一次 HTTP 请求,适合 10KB 以内的小图标。超过这个量级建议用普通 URL,否则 HTML 会膨胀得惊人。

3. Basic Auth HTTP 头里的 Authorization: Basic dXNlcjpwYXNz 就是 user:pass 的 Base64 编码。不是加密——所以 Basic Auth 必须配合 HTTPS 用,否则等于明文传密码。

URL-safe 变种

标准 Base64 用了 + /,这两个字符在 URL 里有特殊含义。URL-safe Base64 把它们换成 - _,并去掉末尾的 = 填充:

  • 标准:YWJjMTIzIT8kKiYoKSctPUB+
  • URL-safe:YWJjMTIzIT8kKiYoKSctPUB-

JWT Token 用的就是 URL-safe 变种。

辨识 Base64 的小技巧

  • 长度是 4 的倍数(末尾可能有 === 填充)
  • 只含 A-Z a-z 0-9 + / =
  • 解码后通常是合理的字节序列(文本、图片 magic number 等)

编解码 + 预览

文本编码、文件上传转 Base64、带 data URL 前缀的图片预览——贴进去看实时输出,也能反向把 Base64 还原成原始文件下载。

❓ 常见问题

Base64 能当加密用吗?

不能。Base64 是公开编码,任何人贴进在线工具就能解出来。它的目的是让二进制数据能在文本协议里传输,不是保密。真正的加密(AES 等)需要密钥,没密钥就解不开,这和 Base64 有本质区别。

为什么 Base64 结果末尾常有一个或两个 `=`?

Base64 每 3 字节对应 4 个字符。如果原始字节数不是 3 的倍数,末尾用 `=` 补齐。余 1 字节填两个 `==`,余 2 字节填一个 `=`,正好 3 倍数则无 `=`。`=` 帮助解码器知道原始数据长度。

图片转 Base64 后体积会变大吗?

会。Base64 的固定开销是 +33%(每 3 字节变 4 字节)。100KB 图片编码后约 133KB。所以 data URL 只适合内嵌小图标(< 10KB),大图片用 Base64 反而拖慢页面加载。

URL 里能直接用 Base64 吗?

标准 Base64 不能——含 `+` `/` 字符在 URL 里有特殊含义会出错。要用 URL-safe Base64:把 `+` 换成 `-`、`/` 换成 `_`,并去掉末尾 `=`。JWT Token 用的就是这个变种。

🔠 打开 Base64 文本 ↔ Base64 · UTF-8 安全 · 中文无乱码

📖 同一工具的其他教程