Base64 是什么?
Base64 是一种将二进制数据转换为可打印 ASCII 文本的编码方案。它不是加密,不是压缩——它只是换了一种“写法”,让二进制内容能在只支持文本的系统里安全传输。
试一试
文本 → Base64
13 字符 → 20 个 Base64 字符(+54%)
Base64 → 文本
Base64 是什么
Base64 是一种二进制到文本的编码方案,由 RFC 4648 定义。它的名字来自它使用64 个可打印 ASCII 字符(A–Z、a–z、0–9、+、/)表示任意二进制数据。
Base64不是加密,也不是压缩。任何人都可以一键解码 Base64 字符串,不需要密鑰或密码。它唯一做的事是把二进制换成文本——方便传输,不方便保密。
比喻:想象你需要通过只能发文字的渠道寄一张纸质地图。你可以用经纬度坐标把地图上每个点重新描述成文字——内容没变,只是换了一种能传递的格式。Base64 对二进制数据做的是同样的事。
为什么 Base64 会被发明
早期的电子邮件协议(SMTP)和许多网络协议只设计用来传输7-bit ASCII 文本。二进制数据(图片、文件)包含值为 0–255 的任意字节,其中很多字节在这些协议里有特殊含义(换行、结束符、控制字符),直接传输会导致内容损坏。
Base64 通过只使用 64 个“安全”的 ASCII 字符,确保编码后的数据在任何文本协议中都能原样传输。今天它最常见的用途包括:
- 将图片、字体内嵌到 HTML / CSS(Data URL)
- 在 JSON API 中传递文件附件
- HTML 邮件中嵌入图片(邮件客户端不支持二进制附件内嵌)
- JWT(JSON Web Token)的 payload 编码(使用 Base64URL 变体)
- HTTP Basic 认证的 username:password 编码
- 在 XML / JSON 中存储二进制数据
Base64 是怎么工作的
原始文件 / 文本
Binary data
二进制字节
01001101 01100001…
Base64 编码
每 3 字节 → 4 字符
纯文本字符串
TWFu…(可安全传输)
编码过程分三步:
- 1取 3 个字节(24 bit): 从输入数据每次取 3 个字节,拼成一个 24 位的二进制数。
- 2拆成 4 组 6 bit: 将 24 bit 均分为 4 组,每组 6 bit。6 bit 最多表示 64 个不同的值(2⁶ = 64)。
- 3查表替换为字符: 用每组 6 bit 的值(0–63)查 Base64 字母表,得到对应的 ASCII 字符。3 个字节变成 4 个字符。
示例:字符串 Man 如何编码为 TWFu
| 输入字符 | M | a | n | |
|---|---|---|---|---|
| ASCII 字节 | 01001101 | 01100001 | 01101110 | |
| 6-bit 分组 | 010011 | 010110 | 000101 | 101110 |
| 十进制索引 | 19 | 22 | 5 | 46 |
| Base64 字符 | T | W | F | u |
3 个字节(24 bit)→ 4 个 Base64 字符 = 体积 ×4/3,即增大约33%
Base64 字母表
标准 Base64(RFC 4648)使用以下 64 个字符,加上 = 作为填充符:
A–Z
ABCDEFGHIJKLMNOPQRSTUVWXYZ
索引 0–25
a–z
abcdefghijklmnopqrstuvwxyz
索引 26–51
0–9
0123456789
索引 52–61
+ /
+/
索引 62–63
Base64URL 变体(用于 JWT 和 URL)将 + 替换为 -,将 / 替换为 _,并省略 = 填充,避免在 URL 和查询字符串中产生歧义。
实际例子
普通文本
原始
Hello, World!Base64
SGVsbG8sIFdvcmxkIQ==末尾 == 是 padding,因为 13 字节不是 3 的倍数
Data URL(图片内嵌)
原始
<img src="data:image/png;base64,iVBORw0KGgo…">Base64
CSS: background-image: url("data:image/png;base64,…")直接写在 HTML/CSS 里,无需额外 HTTP 请求
JWT Payload(Base64URL)
原始
{"sub":"1234567890","name":"Alice","iat":1516239022}Base64
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIiwiaWF0IjoxNTE2MjM5MDIyfQ无 = 填充,用 - 和 _ 替换 + 和 /(Base64URL)
HTTP Basic Auth
原始
username:passwordBase64
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=仅编码,不加密——必须配合 HTTPS 使用
Base64 的局限性
体积增大约33%
每 3 字节变为 4 字符,加上填充符,编码后体积约为原来的 1.33 倍。大文件不适合 Base64。
不是加密
Base64 无法保护数据。任何人一行代码即可解码。敏感数据必须用真正的加密算法。
浏览器处理大文件会卡
FileReader.readAsDataURL() 在主线程全量处理,10 MB 文件足以让页面卡顿。
无法流式处理
标准 Base64 需要完整数据才能编解码,不支持逐块流式处理,不适合实时数据。
相关工具
常见问题
Base64 是什么?
Base64 是一种将二进制数据编码为可打印 ASCII 文本的方案,使用 64 个字符(A–Z、a–z、0–9、+、/)表示任意二进制内容。它让二进制数据能在只支持文本的协议中安全传输。
Base64 是加密吗?
不是。Base64 是编码,不是加密。没有密鑰,任何人都可以一行代码解码。不要用 Base64 保护敏感数据。
为什么 Base64 会让文件变大?
Base64 将每 3 字节编码为 4 个字符(每字符 1 字节),体积变为原来的 4/3,约增大 33%。这是用文本传输二进制数据不可避免的代价。
Base64 和 Base64URL 有什么区别?
Base64URL 是 URL 安全变体:将 + 替换为 -,将 / 替换为 _,并省略 = 填充。这样编码结果可以直接放在 URL 和查询字符串中不会被误解析。JWT 使用的就是 Base64URL。
什么时候应该用 Base64?
需要在纯文本环境中传递二进制数据时——例如 CSS/HTML 内嵌小图片、JSON API 传文件附件、HTML 邮件嵌入图片。文件较大或需要上传到服务器时,应使用 multipart/form-data。
怎么在 JavaScript 中编解码 Base64?
浏览器内置 btoa()(编码)和 atob()(解码)。但这两个函数只支持 Latin-1 字符,处理中文或 emoji 需要先用 TextEncoder 转为 UTF-8 字节再编码,解码时用 TextDecoder。Node.js 可以用 Buffer.from(str).toString('base64') 和 Buffer.from(b64, 'base64').toString('utf8')。