Base64
一种将二进制数据转换为 ASCII 字符串的编码方式,使用 A-Z、a-z、0-9、+ 和 / 共 64 个字符。
Base64 是一种将二进制数据转换为 ASCII 字符串的编码方式。它使用 64 个字符:A-Z (26 个)、a-z (26 个)、0-9 (10 个)、+ 和 /,将 3 个字节的数据表示为 4 个字符。当输入数据长度不是 3 的倍数时,末尾会添加填充字符 (=)。
Base64 之所以必要,是因为电子邮件和 HTTP 等基于文本的协议无法直接传输原始二进制数据。它广泛应用于电子邮件附件 (MIME)、数据 URI 方案 (data:image/png;base64,...)、JWT (JSON Web Token) 以及 API 请求/响应体。例如,将小图标图片以数据 URI 的形式用 Base64 编码直接嵌入 HTML,可以减少 HTTP 请求数量。Web 安全基础书籍介绍了 Base64 的应用场景。
在 JavaScript 中,btoa() 用于编码,atob() 用于解码。但这些函数只能处理 Latin-1 字符,包含中文等多字节字符时需要配合 TextEncoder 使用。在 Node.js 中使用 Buffer.from(data).toString('base64')。Python 提供了 base64 模块,Java 则有标准的 java.util.Base64 类。
一个常见的误解是将 Base64 与加密混淆。Base64 纯粹是编码 (可逆转换),不提供任何安全保护。任何人都可以轻松解码,因此不能用于保护密码或敏感信息。此外需要注意,数据大小会增加约 33%,因为 3 个字节变成 4 个字符,结果是原始大小的 4/3 倍。网络协议入门书籍解释了 Base64 的技术背景。
在 URL 或文件名中包含 Base64 字符串时,标准的 + 和 / 字符因具有特殊含义而会导致问题。Base64url (RFC 4648) 通过将 + 替换为 -、/ 替换为 _ 来解决此问题。从字符计数的角度来看,Base64 编码后的字符串长度可以根据原始字节数精确计算:ceil(n / 3) * 4 个字符 (含填充)。