本文目录
什么是 Base64?
Base64 是一种将二进制数据转换为 ASCII 字符串的编码方案。它使用 64 个安全字符(A-Z、a-z、0-9、+、/)来表示任意二进制数据,从而能安全地在基于文本的协议中传输,例如 HTTP 头部、电子邮件(MIME)和 JSON。
Base64 不是加密 —— 它是编码。任何人无需任何密钥即可将 Base64 解码回原始数据。Base64 的目的是让二进制数据能够通过那些为文本设计的系统,而非提供安全性。
Base64 编码的工作原理
Base64 将每 3 个字节(24 位)的分组转换为 4 个 Base64 字符(每个 6 位),当输入不能被 3 整除时,用 = 字符进行填充。
- 字节分组 —— 输入字节以 3 个为一组进行分组,并转换为 4 个输出字符
- 字符映射 —— 每个 6 位分组映射到 64 个可打印 ASCII 字符中的一个
- 填充 —— 添加 = 字符以确保输出长度始终是 4 的倍数
免费试用 —— 无需注册
编码或解码 Base64 →何时使用 Base64
每当需要将二进制数据嵌入基于文本的格式时,就会用到 Base64。
- 电子邮件附件 —— MIME 编码使用 Base64 将二进制文件附加到电子邮件消息中
- Data URI —— 将图片以 data:image/png;base64,... 的形式直接嵌入 HTML/CSS,从而避免 HTTP 请求
- API 身份验证 —— Basic Auth 凭据在 Authorization HTTP 头部中以 Base64 编码传输
常见问题
Base64 会增大数据体积吗?
会。Base64 编码会使体积增大约 33%,因为每 3 个字节的输入会产生 4 个字节的输出。这是让二进制数据变得文本安全所固有的代价。
标准 Base64 和 URL 安全 Base64 有什么区别?
标准 Base64 使用 + 和 /,而它们在 URL 中具有特殊含义。URL 安全 Base64(Base64url)将 + 替换为 -、将 / 替换为 _,从而生成无需百分号编码即可安全用于 URL 和文件名的字符串。JWT 使用的就是 Base64url 编码。
如何处理非 UTF-8 数据的 Base64?
Base64 处理的是原始字节,而非文本。在对图片或加密内容等二进制数据进行编码时,应将其视为字节数组而非字符串。在 JavaScript 中,使用 Uint8Array 或 Buffer;在 Python 中,使用 bytes 对象,以避免非 UTF-8 数据带来的编码问题。