作为开发者,你一定见过类似这样的字符串:data:image/png;base64,iVBORw0KGgo...。这就是大名鼎鼎的 Base64 编码。它在 Web 开发、电子邮件协议和 API 认证中扮演着不可或缺的角色。
为什么需要 Base64?
计算机底层只认识 0 和 1(二进制数据)。在早期的互联网时代,许多文本传输协议(例如发邮件的 SMTP 协议)被设计为只能安全传输 128 个 ASCII 字符(包括大小写字母、数字和一些标点符号)。
如果你想通过这些“纯文本通道”发送一张 JPEG 图片、一个 Zip 压缩包,或者甚至是一段非英文字符(如中文),这些二进制数据中会包含大量的控制字符(如不可见字符),它们会被底层的路由和邮件服务器当作指令去执行,或者在传输途中被错误地截断和修改,导致最终收到的文件损坏。
Base64 的核心使命,就是将“不可读的二进制数据”转换成“绝对安全的纯文本字符”。
它是怎么工作的?
Base64 选取了 64 个最常见的、在所有系统中都不会产生歧义的字符作为它的“字母表”:
- 大写字母 A-Z (26个)
- 小写字母 a-z (26个)
- 数字 0-9 (10个)
- 符号
+和/(2个) (合计 64 个字符,因为 $2^6 = 64$,所以每个 Base64 字符正好可以表示 6 个 bit 的信息)
转换过程简单优雅:
- 计算机读取二进制文件,按每 3 个字节(即 $3 \times 8 = 24$ 个 bit)划分为一组。
- 将这 24 个 bit 重新拆分为 4 个小组,每组 6 个 bit。
- 在这 4 个 6-bit 组的最前面各补上两个
0,变成 4 个 8-bit 的新字节(其数值范围一定在 0 到 63 之间)。 - 用这些数值去上面提到的 64 个字符表中查表,替换成对应的字母。
如果原始数据的长度不是 3 的倍数,Base64 算法会在末尾补充特定的补位符(通常是 = 号)。
Base64 的代价与应用场景
虽然 Base64 解决了二进制传输的问题,但它是有代价的:体积膨胀。由于原本 3 个字节的数据被硬生生拆分成了 4 个字节,Base64 编码后的文件体积会比原文件大出约 33%。
常见的使用场景包括:
- 小图片的内联(Data URI): 利用 图片转 Base64 工具,可以将极小的图标直接写入 CSS 或 HTML,减少一次 HTTP 网络请求。但绝不要对 MB 级别的大图进行编码!
- HTTP Basic Auth: 在请求头中以
Authorization: Basic [Base64编码]的形式传输用户名和密码。 - JWT (JSON Web Token): JWT 的标头和负载部分均使用 Base64URL(一种稍微修改的变体,将
+和/替换为安全的字符)进行编码。
最后重申一个常识:Base64 只是编码,绝对不是加密! 任何人都可以轻易地将其反解还原。永远不要用 Base64 来保护你的密码!