Base64 是什么
Base64 是一种把二进制数据编码成纯文本的方式。它用 64 个可打印字符(A-Z、a-z、0-9、+、/)表示任意二进制数据,让二进制能通过只支持文本的通道传输(如 JSON、XML、URL、邮件)。
编码原理
字符表
Base64 用 64 个字符:大写 A-Z(26)、小写 a-z(26)、数字 0-9(10)、加号 +、斜杠 /,共 64 个。等号 = 用作末尾填充。
编码过程
- 把输入数据按每 3 字节(24 位)一组
- 把 24 位拆成 4 组,每组 6 位
- 每 6 位对应一个 Base64 字符(2 的 6 次方 = 64,正好 64 个字符)
- 不足 3 字节用 = 填充
举例
3 字节输入(24 位)→ 4 个 Base64 字符。所以编码后字节数是原来的 4/3,即约 133%,增大 33%。
为什么变大 33%
原本质上 1 字节能表示 256 种值(8 位),Base64 每个字符只表示 64 种值(6 位)。要表示同样信息量,6 位编码比 8 位编码多用 8/6 = 4/3 的字符。所以 Base64 编码后体积是原来的 4/3,增大 33%。
这是 Base64 的固有代价——用空间换"文本可传输"。
编码示例
文本 "Man"(3 字节 ASCII):
- M = 77 = 01001101
- a = 97 = 01100001
- n = 110 = 01101110
- 拼成 24 位:01001101 01100001 01101110
- 拆成 4 组 6 位:010011 010110 000101 101110
- 对应 Base64 字符:T W F u
- 编码结果:TWFu
3 字节变成 4 字节,正好 4/3。
Base64 变体
标准 Base64
字符表含 + 和 /,末尾用 = 填充。适合通用场景。
URL 安全 Base64
- 和 / 在 URL 里有特殊含义,替换成 - 和 _。适合 URL 传输。
Base64URL
URL 安全变体,常用于 JWT(JSON Web Token)。
Base64 vs Base32 vs Hex
Base64
- 字符集 64 个
- 编码后增大 33%
- 字符含大小写字母数字和 +/,区分大小写
Base32
- 字符集 32 个(A-Z、2-7)
- 编码后增大 60%
- 不区分大小写、避开易混字符,适合人工输入场景
Hex(十六进制)
- 字符集 16 个(0-9、a-f)
- 编码后增大 100%(每字节变两字符)
- 最简单、最兼容,但体积翻倍
体积:Hex > Base32 > Base64。要小选 Base64,要兼容简单选 Hex。
Base64 是加密吗
不是。Base64 是编码,不是加密。任何人都能解码,没有密钥保护。把 Base64 当加密用是严重误解——它只是"伪装"成乱码,解码即明文。
敏感数据要加密用 AES 等加密算法,Base64 只用于传输编码。
使用场景
数据传输
二进制数据通过文本通道传输(JSON、XML、URL、邮件),用 Base64 编码成文本。
嵌入小图
小图编成 Base64 内联进 HTML/CSS,减少 HTTP 请求(详见 Base64 图片用途)。
JWT
JSON Web Token 用 Base64URL 编码 header 和 payload。
数据 URI
data URL 协议用 Base64 嵌入资源。
Basic Auth
HTTP Basic 认证用 Base64 编码用户名密码(注意不是加密,要配 HTTPS)。
用 DocsAll 编解码
- 输入文本或 Base64 字符串
- 选择编码或解码
- 一键转换
- 复制结果
浏览器端处理,数据不外传。
常见坑
当成加密
Base64 不加密,敏感数据别只靠 Base64"保护"。
编码后体积变大
大文件 Base64 编码膨胀 33%,传输和存储成本增加。能用二进制通道就别用 Base64。
字符集混淆
标准 Base64 含 +/,放进 URL 要转义或用 URL 安全变体。混用变体导致解码失败。
末尾 = 不可省
填充符 = 是编码的一部分,省略可能解码错误。部分实现容忍省略,但不规范。
小结
Base64 是编码不是加密,用 64 字符表示二进制,体积增大 33% 是固有代价。用途是让二进制走文本通道传输。URL 场景用 URL 安全变体。DocsAll 编解码工具浏览器端运行,数据不外传。