Base64 不是加密:三个常见误区
经常见到「用 Base64 加密一下」这种说法。Base64 只是编码,任何人一秒可还原。本文说清编码与加密的区别,以及哪些地方确实该用 Base64。
这是最常被混淆的一对概念。一句话说清楚:Base64 是编码(encoding),不是加密(encryption)。
误区一:Base64 能保护数据
不能。Base64 没有密钥,算法完全公开,任何人拿到字符串都能立即还原:
SGVsbG8gV29ybGQ= → Hello World
它唯一的作用是把二进制数据表示成 ASCII 字符,好让数据能安全地通过只支持文本的通道(HTTP 头、URL、邮件正文、JSON 字段)。
把密码 Base64 一下存进数据库,安全性等于明文存储。
误区二:Base64 能减小体积
恰恰相反,它会增大约 33%。原因是每 3 个字节(24 位)被拆成 4 个 6 位组,再映射到 64 个可打印字符;不足 3 字节的尾部还要用 = 补齐。
所以它适合「必须走文本通道」的场景,不适合用来压缩。
误区三:URL 里的 Base64 和普通 Base64 一样
不一样。标准 Base64 的字符集包含 + 和 /,这两个字符在 URL 里有特殊含义(+ 表示空格、/ 是路径分隔符),还可能出现在文件名里。
于是有了 Base64URL:把 + 换成 -、/ 换成 _,并且去掉末尾的 =。JWT 用的就是这一种。
那什么时候真的该用
- 在 JSON 里传二进制:图片、密钥文件等内容转成 Base64 后可以塞进字符串字段
- HTTP Basic 认证:
Authorization: Basic base64(user:pass)(注意这仍然不是加密,必须配合 HTTPS) - Data URI:
data:image/png;base64,...把图片内联进 HTML 或 CSS - JWT 的 Header 与 Payload:用 Base64URL 编码,防篡改靠的是第三段签名而非编码
- 邮件附件:MIME 标准就是这么传输二进制的
真要加密该用什么
- 对称加密:AES-256-GCM(既保密又防篡改)
- 非对称加密:RSA-OAEP、ECDH
- 只做完整性校验:SHA-256 等哈希(不可逆,用于校验而非加密)
- 存密码:bcrypt、scrypt、Argon2(专门设计的慢哈希,不能也不该还原)