什么是Base64编码?完整指南
· Cosyslabs
Base64编码使用一组64个可打印字符将二进制数据转换为ASCII文本。它用于通过HTTP和电子邮件等基于文本的协议安全传输二进制内容,以及直接在HTML、CSS和JSON数据中嵌入图像或文件,不会产生数据损坏或丢失。
为什么需要Base64
许多协议——SMTP、HTTP头部、XML——设计之初只用于传输文本,而非任意二进制字节。当通过这些通道发送原始二进制数据时,某些字节值会被解释为控制字符、换行符或空终止符,从而导致数据损坏。Base64通过将所有可能的字节序列映射到一个安全的可打印ASCII字符子集来解决这个问题。
Base64的工作原理:6位分组
Base64通过将8位字节重新分组为6位块来处理二进制数据。
- 取三个输入字节(共24位)。
- 分成四个6位组。
- 将每个6位值(0–63)映射到Base64字母表中的一个字符。
Base64字母表使用:
A–Z(值0–25)a–z(值26–51)0–9(值52–61)+和/(值62–63)=作为填充
示例:
输入: "Man"
二进制: 01001101 01100001 01101110
分组: 010011 010110 000101 101110
值: 19 22 5 46
输出: T W F u → "TWFu"
当输入长度不能被三整除时,会附加 = 或 == 填充。
JavaScript中的编码和解码
现代JavaScript为浏览器环境提供内置的Base64支持:
// 编码
const encoded = btoa("Hello, World!");
console.log(encoded); // "SGVsbG8sIFdvcmxkIQ=="
// 解码
const decoded = atob("SGVsbG8sIFdvcmxkIQ==");
console.log(decoded); // "Hello, World!"
对于Node.js(v16+),使用 Buffer:
// 编码
const encoded = Buffer.from("Hello, World!").toString("base64");
// 解码
const decoded = Buffer.from("SGVsbG8sIFdvcmxkIQ==", "base64").toString("utf8");
URL安全的Base64
标准Base64使用 + 和 /,这些是URL中的保留字符。URL安全的Base64将它们替换:
| 标准 | URL安全 |
|---|---|
+ | - |
/ | _ |
= | 省略或 %3D |
JWT令牌使用不带填充的URL安全Base64。解码JWT载荷时,需要在解码前恢复填充:
function decodeJwtPayload(token) {
const [, payload] = token.split(".");
const padded = payload.replace(/-/g, "+").replace(/_/g, "/");
const padLength = (4 - (padded.length % 4)) % 4;
return JSON.parse(atob(padded + "=".repeat(padLength)));
}
数据URI
数据URI使用Base64将文件内容直接嵌入HTML或CSS:
<!-- 内联PNG图像 -->
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..." />
<!-- CSS中的内联SVG -->
.icon {
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucy...");
}
数据URI适用于:
- 减少HTTP请求的小图标
- 需要嵌入资源的离线/PWA应用
- 外部图像被屏蔽的电子邮件模板
避免对大图像使用数据URI。它们会增加HTML大小、绕过浏览器缓存,且无法延迟加载。
常见用例
HTTP基本认证
Authorization 头部使用Base64对凭据进行编码:
Authorization: Basic dXNlcjpwYXNzd29yZA==
解码后得到 user:password。这里Base64提供的是编码,而非加密——始终使用HTTPS。
电子邮件附件(MIME)
SMTP以文本形式传输电子邮件。MIME将二进制附件编码为Base64块:
Content-Transfer-Encoding: base64
SGVsbG8sIFdvcmxkIQ==
API响应
某些API在JSON内以Base64字符串返回二进制数据(缩略图、PDF):
{
"filename": "report.pdf",
"content": "JVBERi0xLjQK..."
}
Base64不是加密
Base64无需密钥即可逆——任何人都可以立即解码。它不提供任何安全保障。切勿使用Base64来"隐藏"密码、API密钥或敏感数据。
大小开销
Base64将数据大小增加约33%:每3个字节变成4个字符。对于1MB的二进制文件,Base64表示约为1.37MB。传输时结合gzip压缩可部分恢复大小。
| 原始大小 | Base64大小 |
|---|---|
| 1 KB | ~1.37 KB |
| 100 KB | ~137 KB |
| 1 MB | ~1.37 MB |
立即试用
使用Base64编码/解码工具直接在浏览器中编码和解码字符串、文件和数据URI——数据不会离开您的设备。
总结
- Base64使用64个可打印字符将二进制转换为文本
- 通过将8位字节重新分组为6位块来工作
- URL安全变体将
+//替换为-/_ - 用于HTTP认证、电子邮件附件、数据URI和API
- 不是加密——不提供任何安全保证
- 增加约33%的大小开销
更多Cosyslabs工具
处理二进制数据和文件格式?这些Cosyslabs工具涵盖相关用例:
- PDF Convert All — 在线转换、合并、压缩和提取PDF。
- Unit Convert All — 转换数据存储大小(字节 ↔ KB ↔ MB ↔ GB)。
- Routine Toolkit — 日常生产力工具:字数统计、贷款计算器等。
- Cosyslabs — Dev Tools !、PDF Convert All等产品背后的工作室。