Base64 是每个开发者迟早都会遇到、但很多人存在误解的东西。最常见的误区:认为 Base64 编码是一种安全措施或加密手段。它完全不是。让我们先澄清这一点——然后再聊 Base64 究竟是什么、如何工作,以及什么时候真正需要用到它。
什么是 Base64?
Base64 是一种编码方案,用于将二进制数据转换为可打印 ASCII 字符的字符串。名称来源于它使用 64 个可打印字符来表示数据:26 个大写字母(A–Z)、26 个小写字母(a–z)、10 个数字(0–9),以及 + 和 /(用 = 补位)。
关键点在于:编码不是加密。当你对某个内容进行 Base64 编码时,你并没有隐藏它。任何看到 Base64 字符串的人都可以立刻解码——不需要密钥,不需要密码。如果你对文本 hello 进行 Base64 编码,得到的是 aGVsbG8=。把它丢进解码器,你就得到了 hello。
Base64 存在的理由完全不同:兼容性。某些系统——电子邮件协议、URL、HTML 属性、特定 API——最初被设计为处理文本,而非任意二进制数据。Base64 是一种将二进制数据(如图片或文件)转换为仅使用安全可打印 ASCII 字符的方式,使其能够在这些基于文本的系统中传输而不被破坏。
Base64 的工作原理(简要版)
二进制数据是字节流,每个字节是 8 位。Base64 每次取 3 个字节(24 位),将它们分成 4 组,每组 6 位。每个 6 位的组映射到 Base64 字母表中的一个字符。
为什么是 6 位?因为 2⁶ = 64,正好是编码字母表中的字符数量。
结果:每 3 个字节的输入变成 4 个 Base64 字符的输出。这意味着 Base64 编码后的数据比原始数据大约大 33%。这就是代价——以体积换兼容性。
如果输入不是 3 字节的倍数,则在末尾添加填充字符(= 或 ==),使输出长度为 4 的倍数。
开发者在哪些地方用到 Base64?
Base64 在日常 Web 开发中出现的频率出乎意料地高:
Data URL(内联图片)
当你将图片直接嵌入 HTML 或 CSS 而不使用单独的文件时,就会用到 Data URL。图片的二进制内容经过 Base64 编码后内联放置:
<img src="data:image/png;base64,iVBORw0KGgoAAAANS..." />
这种技术适合小图标或希望打包进单文件的图片,可以减少一次 HTTP 请求。
JWT(JSON Web Token)
JWT 使用 Base64URL 编码(Base64 的 URL 安全变体,将 + 替换为 -,/ 替换为 _)。JWT 的 header 和 payload 部分是 Base64URL 编码的 JSON 对象——这就是为什么你可以把一个 JWT 丢进解码器直接读取其中的声明(claims)。这并非加密。签名部分用于验证完整性,但 payload 对任何人都是可读的。
HTTP Basic 认证
当浏览器或 API 客户端发送 Basic Auth 凭证时,用户名:密码 字符串会被 Base64 编码后放入 Authorization 请求头:
Authorization: Basic dXNlcjpwYXNzd29yZA==
解码 dXNlcjpwYXNzd29yZA== 得到的就是 user:password。这就是为什么 Basic Auth 必须始终在 HTTPS 下使用——凭证是可以被轻易还原的。
电子邮件附件(MIME)
管理邮件附件的 MIME 标准使用 Base64 来编码二进制文件。当你收到一封带有 PDF 附件的邮件时,那个 PDF 在原始邮件源码中就是 Base64 编码的。原本设计用于纯文本的邮件服务器,可以通过这种方式安全地传输二进制内容。
在 JSON 或 XML 中存储二进制数据
JSON 没有原生的二进制类型。当 API 需要在 JSON 响应中包含二进制数据(如缩略图或加密密钥)时,Base64 编码是标准做法。
常见误区
"Base64 是加密" 不是。它可以被轻易还原。永远不要用 Base64 来"保护"敏感数据。加密请使用 AES、RSA 等真正的加密算法。
"Base64 可以压缩数据" 恰恰相反。Base64 会让数据体积增加约 33%。这是为了兼容性而接受的大小代价。
"存储密码前应该 Base64 编码" 绝对不要这样做。密码应当使用 bcrypt、Argon2 或 scrypt 等合适的算法进行哈希处理。Base64 不提供任何安全保障。
"Base64URL 和 Base64 是同一回事"
接近但不完全相同。Base64URL 将 + 替换为 -,/ 替换为 _,并省略填充符。这使其可以安全用于 URL 和文件名,无需百分比编码。
如何在线进行 Base64 编解码
你不需要写代码就能对内容进行 Base64 编码或解码。ujiffy 的免费 Base64 工具让你可以:
- 将任何文本或二进制输入编码为 Base64
- 将任何 Base64 字符串解码回原始内容
- 完全在浏览器中运行——不向服务器发送任何内容
- 支持标准 Base64 和 Base64URL
开发者需要在代码中使用时的快速参考:
// JavaScript
btoa("hello") // 编码 → "aGVsbG8="
atob("aGVsbG8=") // 解码 → "hello"
// Python
import base64
base64.b64encode(b"hello") # → b'aGVsbG8='
base64.b64decode("aGVsbG8=") # → b'hello'
小结
Base64 是一种默默支撑着现代 Web 大量功能的编码方式——从内联图片到认证头,再到 JWT,无处不在。理解它是什么(以及它不是什么)能帮助你正确使用它,避免将其误当成加密手段的安全错误。它是兼容性工具,不是安全工具。请按此认知使用它。