Base64 实用指南
本指南通过实际场景解释 Base64 的作用、使用边界和排错方法。除非特别说明,示例使用标准 Base64。
独立教程
1. Base64 是什么
Base64 是一种二进制到文本的编码方式。它把每三个输入字节映射为四个可打印字符,字符来自 A-Z、a-z、0-9、加号和斜杠;最后一组不足三个字节时用等号填充。由于三个字节变成四个字符,编码后的体积通常增加约三分之一。编码不会隐藏信息,任何拿到字符串的人都可以解码。
它适合在只接受文本的系统中传输二进制数据,例如邮件 MIME、JSON 字段、数据 URL、配置文件和 API 请求。大文件使用 Base64 会增加带宽和内存开销,通常不如直接使用文件存储。
2. 正确编码文本
文本必须先按明确的字符集转换为字节。现代应用通常应优先使用 UTF-8,因为它能稳定表示 Unicode。像“你好”这样的文本不是按外观编码,而是先转换为 UTF-8 字节再编码。如果一端使用 UTF-8,另一端却按 GBK 或 Windows-1252 解码,结果就可能出现乱码。
使用浏览器工具时,请选择源字符集后再粘贴文本。整段编码和逐行编码会得到不同结果,换行符使用 LF 还是 CRLF 也应在接口文档中明确说明。
可以直接用Base64 编码工具试一下。
const text = "你好,Base64";
const encoded = btoa(unescape(encodeURIComponent(text)));
console.log(encoded);
const decoded = decodeURIComponent(escape(atob(encoded)));
console.log(decoded);
3. 解码文本和文件的区别
解码后的字节不一定是文本。PNG、PDF、ZIP 或证书即使解码成功,也不适合显示在文本框中。已知原内容是二进制文件,或输入以 data:application/pdf;base64,... 形式开头时,应使用文件解码功能保存还原后的字节。
邮件和文档常会在 Base64 中插入换行。解码器通常可以忽略这些空白,但字符表中间的误改会破坏数据。排错时可以比较文件长度和文件签名。
可以直接用Base64 解码工具试一下。
4. Base64URL 与填充符
URL 对加号和斜杠有特殊含义,因此 Base64URL 用连字符替换加号、用下划线替换斜杠,很多生成器还会省略末尾填充符。URL 安全解码器需要在转换前恢复必要的填充。不要在同一个值中混用标准字符表和 URL 安全字符表。
Base64URL 常见于 JWT 和 URL 参数,但它不是加密,也不能证明令牌可信。应用仍需进行身份验证、授权、长度校验,并使用正确的加密设计保护秘密。
5. HTML 和 CSS 中的数据 URL
数据 URL 将媒体类型和编码内容放在一个字符串中,例如 data:image/png;base64,...。它适合小图标、测试夹具或自包含演示。较大的数据 URL 会让 HTML 和 CSS 难以缓存和维护,普通静态资源通常更便于更新。
解析数据 URL 时,应把逗号之前的元数据和之后的 Base64 内容分开。媒体类型只是提示,不代表字节一定有效;显示不可信内容前仍应校验文件签名。
6. API 和 JWT 中的 Base64
API 常用 Base64 传输二进制字段,但普通字符串本身已经是 JSON 文本,未必需要再次编码。JWT 的头部和载荷使用 Base64URL 编码,它们可以被读取,不是机密存储。不要把密码或隐私信息直接放进 JWT 载荷。
接入 API 时,应记录是否要求填充符、是否允许换行、使用何种字符集以及最大长度。测试空输入、Unicode 文本、1 和 2 字节输入以及非法字符。
import base64
value = "你好,Base64"
encoded = base64.b64encode(value.encode("utf-8")).decode("ascii")
decoded = base64.b64decode(encoded).decode("utf-8")
print(encoded)
print(decoded)
7. 安全与隐私
Base64 最多只是改变外观,不能防止篡改、验证来源或保护秘密。解码后的内容应视为不可信输入,在解析、渲染或执行前进行校验。浏览器端转换可以减少普通数据上传,但仍不建议向任何网站粘贴密码、访问令牌、医疗信息或其他敏感内容。
机密工作流应使用组织控制下的本地命令行工具或离线库。需要保密传输时,请使用 HTTPS 和经过设计的加密或认证加密方案。
8. 常见错误与排查清单
“Invalid character” 通常表示标准解码器收到了 URL 安全字符或无关标点。“Incorrect padding” 常见于字符串被截断,或删除填充符后却使用不支持无填充输入的解码器。结果乱码多半是字符集不一致;解码成功但文件预览不可读,可能只是因为结果是二进制。
排查时按顺序确认:复制内容完整;识别标准或 URL 安全字符表;只移除允许的空白;选择原始字符集;比较字节长度;检查预期文件签名。可以用 SGVsbG8= 作为已知测试值,它应解码为 UTF-8 文本“Hello”。
# macOS 或 Linux 解码文本
printf 'SGVsbG8=' | base64 --decode
# Python 解码 Base64URL
import base64
base64.urlsafe_b64decode("SGVsbG8")
内容审核:2026 年 8 月 30 日