Base64 编码原理详解:为什么编码后变长 33%
Base64 是最常见的二进制编码方式之一,从邮件附件、Data URL 到 JWT,几乎无处不在。但它常常被误解——有人把它当加密,有人搞不懂为什么编码后体积会变大。本文讲清 Base64 的原理、体积膨胀的原因,以及它和加密的本质区别。
什么是 Base64
Base64 用 64 个可见字符(A-Z、a-z、0-9、+、/,末尾不足时用 = 填充)来表示任意二进制数据。之所以要这样做,是因为很多老协议(如邮件 SMTP)只能传输可打印的 ASCII 字符,二进制直接传会乱码或被截断。Base64 把二进制「翻译」成安全的文本字符,让它能顺利通过这些通道。
为什么编码后会变长 33%
这是 Base64 最常被问到的问题。原理很简单:
- 计算机里每个字节是 8 位。
- Base64 每次取 3 个字节(24 位),拆成 4 组、每组 6 位。
- 每 6 位对应一个 Base64 字符(2 的 6 次方正好是 64,对应 64 个字符)。
所以 3 字节的原始数据,编码后变成 4 个字符——体积是原来的 4/3,约 1.33 倍,也就是膨胀约 33%。这是算法本身的代价,无法避免。
中文为什么要先 UTF-8 编码
Base64 编码的是字节,不是「字符」。一个中文字符在 UTF-8 下通常占 3 个字节。如果直接对中文字符串做 Base64,正确的流程是:
- 把字符串按 UTF-8 编码成字节序列。
- 再对这些字节做 Base64。
跳过第一步、直接把中文字符塞进 Base64 会乱码。另外要特别注意:浏览器原生的 btoa() 只支持 Latin1 字符,处理中文需要先借助 TextEncoder 或 encodeURIComponent 转成字节。
Base64 不是加密
这是最重要的澄清:Base64 是编码,不是加密。
- 它完全可逆——任何人拿到 Base64 都能解码还原原文。
- 它没有密钥、完全公开,不提供任何保密性。
所以把密码、密钥等敏感信息 Base64 一下「保护」起来,是毫无意义的安全错觉——等于明文再加个标签。
常见误用
- 当加密存密码:大忌。Base64 一秒就能还原。
- 删掉末尾的
=:=是必要的填充符,删掉可能导致严格的解码器失败。 - 以为体积不变:忘了 33% 的膨胀,传输大量二进制时成本明显。
实操
想亲手试试 Base64 编解码、验证中文处理或 33% 膨胀,可以用 UPTools Base64 编码解码工具,支持 UTF-8 中文,本地处理不上传。
总结
记住三件事:Base64 是编码不是加密;处理中文要先转 UTF-8 字节;它会让数据膨胀约 33%。理解了这些,就不会再把它误用成「加密」了。
相关文章
- 用 Math.random 生成密码为什么不安全?CSPRNG 与密码熵 用 Math.random 生成密码或 Token 是常见错误,它可被预测。本文讲清为什么必须用 crypto.getRandomValues,以及密码强度由字符集和长度共同决定。
- 为什么在线工具比本地软件更注重隐私?本地处理如何保护你的数据 同样是处理敏感文件,为什么说浏览器本地完成的在线工具反而比某些本地软件更注重隐私?本文讲清本地处理的原理、它保护了什么、以及它的边界。
- SVG 直接内联 HTML 会触发 XSS?压缩与安全检测一次讲清 SVG 不只是图片,它是 XML,能内嵌 script 和事件属性。用 img 引入不会执行脚本,直接内联进 HTML 就可能触发 XSS。本文讲清风险边界和压缩要点。