UPTools UPTools
安全 主笔:工具匠

Base64 编码原理详解:为什么编码后变长 33%

Base64 是最常见的二进制编码方式之一,从邮件附件、Data URL 到 JWT,几乎无处不在。但它常常被误解——有人把它当加密,有人搞不懂为什么编码后体积会变大。本文讲清 Base64 的原理、体积膨胀的原因,以及它和加密的本质区别。

什么是 Base64

Base64 用 64 个可见字符(A-Za-z0-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,正确的流程是:

  1. 把字符串按 UTF-8 编码成字节序列。
  2. 再对这些字节做 Base64。

跳过第一步、直接把中文字符塞进 Base64 会乱码。另外要特别注意:浏览器原生的 btoa() 只支持 Latin1 字符,处理中文需要先借助 TextEncoderencodeURIComponent 转成字节。

Base64 不是加密

这是最重要的澄清:Base64 是编码,不是加密

  • 它完全可逆——任何人拿到 Base64 都能解码还原原文。
  • 它没有密钥、完全公开,不提供任何保密性。

所以把密码、密钥等敏感信息 Base64 一下「保护」起来,是毫无意义的安全错觉——等于明文再加个标签。

常见误用

  • 当加密存密码:大忌。Base64 一秒就能还原。
  • 删掉末尾的 == 是必要的填充符,删掉可能导致严格的解码器失败。
  • 以为体积不变:忘了 33% 的膨胀,传输大量二进制时成本明显。

实操

想亲手试试 Base64 编解码、验证中文处理或 33% 膨胀,可以用 UPTools Base64 编码解码工具,支持 UTF-8 中文,本地处理不上传。

总结

记住三件事:Base64 是编码不是加密;处理中文要先转 UTF-8 字节;它会让数据膨胀约 33%。理解了这些,就不会再把它误用成「加密」了。

相关文章