什么是 Base64 编码?完整指南
什么是 Base64 编码?
Base64 是一种二进制到文本的编码方案,它将二进制数据转换为 ASCII 字符串格式。它的工作原理是将每三个字节的二进制数据翻译为四个 ASCII 字符,这些字符来自一个特定的 64 字符字母表。这使得二进制数据可以安全地通过电子邮件、HTML 或 JSON 等文本通道传输。
“Base64”这个名字源于它使用 64 个字符作为基础:大写字母 A–Z、小写字母 a–z、数字 0–9,以及符号 + 和 /。当输入长度不是 3 的倍数时,使用 = 字符进行填充。
Base64 编码的工作原理
让我们通过一个简单的例子来说明。编码字符串 "Cat":
- 将每个字符转换为 ASCII 值:
C= 67,a= 97,t= 116 - 转换为二进制:
01000011 01100001 01110100 - 分割为 6 位一组:
010000 110110 000101 110100 - 将每个 6 位组映射到 Base64 字母表:
Q2F0
所以 "Cat" 编码为 "Q2F0"。
// JavaScript 中的编码
const encoded = btoa('Cat');
console.log(encoded); // "Q2F0"
// 解码
const decoded = atob('Q2F0');
console.log(decoded); // "Cat"
你可以使用 CodeKit 上的 Base64 编解码工具 来亲自尝试。
常见使用场景
Base64 编码在日常开发中有许多应用:
- Data URL:使用
data:image/png;base64,...将小图片或字体直接嵌入 CSS 或 HTML - 邮件附件:MIME 编码使用 Base64 将二进制文件附加到电子邮件
- API 载荷:在 JSON 请求中传输二进制数据(如图片或文件)
- 身份认证:HTTP Basic Auth 将
用户名:密码以 Base64 编码的形式发送 - JWT 令牌:JSON Web Token 使用 Base64URL 编码头部和载荷部分
Base64 不是加密
最常见的误解之一是把 Base64 当作加密方式。Base64 是编码,不是加密。 它完全不能保护数据——任何人都可以用一行代码解码 Base64 字符串。
// 用 Base64 "加密" 是不安全的!
const "secret" = btoa('my-password');
console.log("secret"); // "bXktcGFzc3dvcmQ="
// 任何人都可以解码:
console.log(atob("bXktcGFzc3dvcmQ=")); // "my-password"
如果你需要保护数据,请使用真正的加密算法(如 AES),或者对密码使用哈希。对于哈希计算,可以试试 哈希生成器 工具。
Base64URL:Web 安全变体
标准 Base64 使用 + 和 / 字符,这在 URL 和文件名中会造成问题。Base64URL 是专为 Web 使用设计的变体:
- 将
+替换为-(连字符) - 将
/替换为_(下划线) - 移除
=填充(或替换)
// 将标准 Base64 转换为 Base64URL
function toBase64URL(base64) {
return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}
// JavaScript 内置的 Base64URL 支持(现代浏览器)
const encoded = btoa('Hello, World!')
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');
console.log(encoded); // "SGVsbG8sIFdvcmxkIQ"
Base64URL 是 JWT 令牌、OAuth2 和许多其他 Web 协议中使用的标准编码方式。
性能考量
Base64 编码会使数据大小增加约 33%。3 字节的输入变成 4 字节的输出。对于小型载荷这种开销可以接受,但对于大文件可能会很显著。需要权衡以下几点:
- 小图标和图片:使用 Data URL 和 Base64 可以减少 HTTP 请求
- 大文件:Base64 编码会膨胀文件大小,建议直接上传文件
- 网络传输:33% 的开销在大量请求中会累积
快速参考表
| 输入大小 | Base64 输出大小 | 开销 |
|---|---|---|
| 1 字节 | 4 字节 | 300% |
| 3 字节 | 4 字节 | 33% |
| 100 字节 | 136 字节 | 36% |
| 1 KB | 1.37 KB | 37% |
总结
Base64 是每个开发者都应该了解的基础编码方案。它对于通过文本系统传输二进制数据至关重要,但请记住——它永远不能替代加密。编码用 Base64,安全用加密。
准备好编码或解码数据了吗?试试 CodeKit 上的 Base64 工具——所有处理都在浏览器中完成,数据不会发送到任何服务器。