Base64 是编码,不是加密。任何人拿到 Base64 字符串,都可以把它解码回原始内容。
Hello -> SGVsbG8=它的作用是把二进制数据转换成只包含常见 ASCII 字符的文本,方便放进 JSON、HTML、CSS、配置文件或接口字段里。
为什么 Base64 会变大?
Base64 大约每 3 个字节编码成 4 个字符,所以体积通常会增加约三分之一。如果把大图片直接塞进 JSON,请求体可能会明显膨胀。
Data URL 和纯 Base64 有什么区别?
| 形式 | 例子 | 用途 |
|---|---|---|
| 纯 Base64 | iVBORw0KGgo... | 只包含编码内容 |
| Data URL | data:image/png;base64,iVBOR... | 包含 MIME 类型,可直接用于 img src |
| URL Safe Base64 | 使用 - 和 _ | 常见于 JWT 和 URL 场景 |
常见坑
- 把 Base64 当作加密,导致敏感信息直接暴露。
- 复制时漏掉末尾 = 填充字符,导致解码失败。
- 把 Data URL 当成纯 Base64 传给后端,后端解析失败。
- 图片太大仍然转 Base64,导致页面和接口变慢。
- 混用标准 Base64 和 URL Safe Base64。
文本为什么还涉及字符编码?
Base64 编码的是字节,不是抽象字符。英文 Hello 在 UTF-8 中是 5 个字节,而中文、Emoji 和其它字符会先按 UTF-8 转成不同的字节序列,再进行 Base64。编码方和解码方如果使用不同字符集,Base64 本身即使完全正确,恢复出的文字仍可能乱码。
文本 → UTF-8 字节 → Base64
Base64 → 字节 → 使用同一字符集还原文本什么时候应该用,什么时候不该用?
| 场景 | 建议 | 原因 |
|---|---|---|
| 很小的图标内联到 CSS | 可以考虑 | 减少一次请求,但会增加文本体积 |
| JSON 中传递少量二进制 | 先确认接口约定 | 需要明确 MIME 类型、长度和大小限制 |
| 大图片或视频 | 不要内联 | 体积膨胀、内存占用和解析成本都很高 |
| 密码、token、个人信息 | 不能当作保护措施 | 解码无需密钥,拿到字符串就能还原 |
解码失败时先确认是否混入 Data URL 前缀、空格或换行,再检查使用的是标准还是 URL Safe 字母表。末尾填充可以按协议省略,但接收方必须明确支持;不要仅靠手工补等号猜测损坏内容。