核心答案:Base64 是把二进制数据编成 64 个可打印字符(A-Z a-z 0-9 + /)的编码——3 字节变 4 字符,体积膨胀约 33%。它是"编码"不是"加密",任何人都能解码,别用它藏敏感信息。
Base64 编码原理
64 个字符表:A-Z(0-25)、a-z(26-51)、0-9(52-61)、+(62)、/(63),外加填充符 =。
编码过程(以 "Hi" 为例):
- 转 ASCII:H=72, i=105
- 转二进制:01001000 01101001
- 按 6 位重分组:010010 000110 100100(补 0)
- 查表:18→S, 6→G, 36→k, 补位 → ==
- 结果:"Hi" → SGk=
| 原始长度 | Base64 长度 | 填充 |
|---|---|---|
| 3n(整除) | 4n | 无 |
| 3n+1 | 4n+4 | == |
| 3n+2 | 4n+4 | = |
体积计算
膨胀率 = 4/3 ≈ 133.3%,每 3 字节多 1 字节。
| 原始大小 | Base64 后 |
|---|---|
| 1 KB | 1.33 KB |
| 100 KB 图片 | 133 KB |
| 10 MB 附件 | 13.3 MB |
常见用途
| 场景 | 例子 |
|---|---|
| 邮件附件 | MIME 标准(SMTP 只传 7 位文本) |
| 图片内嵌 | data:image/png;base64,iVBOR... |
| JWT Token | header.payload.signature 三段 |
| HTTP 基础认证 | Authorization: Basic dXNlcjpwYXNz |
| 源码内嵌小资源 | favicon、占位图 |
Base64 与加密
- Base64 不是加密:无密钥、算法公开、秒级解码
- dXNlcjpwYXNz 解码就是 user:pass——HTTP Basic 认证必须配合 HTTPS
- 把密码"Base64 一下再存"等于明文存储,安全领域最经典错误之一
URL 安全变体
标准 Base64 的 + 和 / 在 URL 中有特殊含义,Base64URL 变体:
- + → −(减号)
- / → _(下划线)
- 去掉填充 =(长度可推)
- JWT、URL 参数传二进制数据都用它
常见误区
- 当加密用:Base64 可逆且无密钥,加密请用 AES,哈希请用 SHA-256。
- 大文件内嵌:超过几十 KB 的图片内嵌 HTML 会让首屏暴涨,且无法缓存——用外链。
- 编码两次:Base64(Base64(x)) 体积膨胀 78%,还常被当作"加固",毫无意义。
- 忽略换行:MIME 规范每 76 字符插入换行,部分解码器对含换行的串报错。
用[Base64 编解码工具](/c/dev/base64)在线编码/解码文本与文件。