很多人第一次见到 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 还原成原始文件下载。