如何把文本转换为 Base64
- 在 输入 · 文本 中输入或粘贴字符串。你输入的内容会被原样编码,包括空格和换行。
- Base64 显示在 输出 · Base64 中。按钮下方的 输入 数值显示你的文本变成了多少字节。
- 字符集 保持 UTF-8 即可,除非负责解码的系统需要其他字符集。
- 如果字符串要放进 URL 或令牌,勾选 URL 安全(- _) 和 不填充(=)。
- 点击 复制输出,或点击 下载 将其保存为
base64.txt。
要转换回来,请使用 Base64 转文本,或者点击 互换 在这里直接解码结果。
同一个字符串,可能有多个 Base64 值
Base64 编码的是字节,而字符串只有通过字符集才会变成字节。这就是为什么同样的五个字母会得到四种不同的结果:
| 字符串 | 字符集 | 字节数 | Base64 |
|---|---|---|---|
Grüße | UTF-8 | 7 | R3LDvMOfZQ== |
Grüße | Windows-1252 或 ISO-8859-1 | 5 | R3L832U= |
Grüße | UTF-16LE | 10 | RwByAPwA3wBlAA== |
Grüße | UTF-16BE | 10 | AEcAcgD8AN8AZQ== |
看不见的字符同样算数。Hello 是 SGVsbG8=,带一个末尾空格的 Hello 是 SGVsbG8g,Hello 后面跟一个 Windows 换行符则是 SGVsbG8NCg==。在多行的值中,换行符是个经典陷阱:line1 和 line2 用 \n 连接编码为 bGluZTEKbGluZTI=,用 \r\n 连接则是 bGluZTENCmxpbmUy。如果两个系统对同一个值的结果不一致,先比较字节数。
Base64 字符串会有多长
输入的每 3 个字节变成 4 个字符,最后剩下的 1 或 2 个字节用 = 补足到 4 个字符。
| 输入字节数 | Base64 字符数 | 示例(重复的 x) |
|---|---|---|
| 1 | 4 | eA== |
| 2 | 4 | eHg= |
| 3 | 4 | eHh4 |
| 4 | 8 | eHh4eA== |
| 10 | 16 | eHh4eHh4eHh4eA== |
所以字符串大约会增大三分之一;如果非 ASCII 字符在 UTF-8 中各占多个字节,增幅会更大。Base64 体积开销 页面给出了换行输出的精确数字。
编码后的字符串用在哪里
人们把字符串转成 Base64,大多是为了让它安全通过那些不欢迎特殊字符的地方:
- 环境变量和 CI 密钥,带引号、
$或换行的值在这里会被弄乱。postgres://app:s3cret@db:5432/app会变成cG9zdGdyZXM6Ly9hcHA6czNjcmV0QGRiOjU0MzIvYXBw,一行,无需任何转义。 - Kubernetes Secret,其
data:中的值必须是 Base64。Kubernetes Secret 解码器 可以把它们读回来。 - HTTP 请求头,比如编码了
user:password的Authorization: Basic。Basic Auth 请求头生成器 会生成完整的请求头。 - JSON 和 XML 字段,需要携带任意文本,又不想被转义规则困扰(JSON 转 Base64)。
这些用法都不能隐藏值。任何拿到字符串的人都能解码,所以编码后的密钥仍要当作明文密钥对待;见 编码与加密。
在代码中把字符串转为 Base64
import base64
base64.b64encode("Grüße".encode("utf-8")).decode("ascii") # 'R3LDvMOfZQ=='
base64.b64encode("Grüße".encode("cp1252")).decode("ascii") # 'R3L832U='
// Node.js
Buffer.from("Grüße", "utf8").toString("base64"); // "R3LDvMOfZQ=="
Buffer.from("Grüße", "utf16le").toString("base64"); // "RwByAPwA3wBlAA=="
两种语言都需要明确写出字符串到字节的转换,字符集的选择就在这一步。更多内容见 Python 和 Node.js 页面。
常见问题
如何把字符串转换为 Base64?
先用某种字符集(几乎所有地方都是 UTF-8)把字符串变成字节,再对字节做 Base64 编码。上面的工具两步都做了;在 Python 中是 base64.b64encode(s.encode("utf-8")).decode()。
同样的文本总是得到同样的 Base64 吗?
只有字节相同时才是。Grüße 在 UTF-8 中是 R3LDvMOfZQ==,在 Windows-1252 中却是 R3L832U=;多一个空格或换行,结果也会改变。
Base64 字符串会有多长?
n 个字节的输入对应 4 × ⌈n / 3⌉ 个字符,不计换行。10 字节的字符串得到 16 个字符;任意长度都可以用 大小计算器 算出来。
能把 Base64 字符串放进配置文件或环境变量吗?
可以,这正是它的主要用途之一:它能把任何值(包括换行和引号)变成一行安全字符。把“换行”保持为“不换行”,就能让它保持在一行。