Base64是编码而非加密,用于将二进制数据转为ASCII字符串;Python中需先encode('utf-8')转bytes再b64encode,返回bytes须decode('ascii')得字符串;Bash解码需严格格式,Go中StdEncoding与URLEncoding不可混用。

Base64 不是加密,而是把任意二进制数据转成纯 ASCII 字符串的编码方式;只要原始数据是 bytes,就能可靠编解码,反之如果传入 str 直接编码,几乎必然报错或得到意外结果。
Python 中必须先转 bytes 再调用 b64encode
Python 的 base64.b64encode() 只接受 bytes 类型,传入字符串会直接抛出 TypeError: a bytes-like object is required。常见错误是忘记 .encode('utf-8') 这一步。
- 字符串编码:先用
.encode('utf-8')转为bytes,再喂给base64.b64encode();解码后用.decode('utf-8')拿回字符串 - 文件内容编码:以
'rb'模式打开,读出的就是bytes,可直接编码 - 注意
b64encode()返回仍是bytes,若要字符串需调用.decode('ascii')(Base64 字符全是 ASCII,安全)
Bash 命令行用 base64 -d 解码时填充和换行很敏感
base64 命令默认严格校验输入格式:长度必须是 4 的倍数、只允许 Base64 字符集(A-Za-z0-9+/)和填充符 =。常见失败现象是 Invalid input 或 Illegal input character。
- 解码前确保字符串末尾无多余空格或换行——
echo -n "xxx" | base64 -d比echo "xxx" | base64 -d更可靠 - 遇到含换行的长 Base64 字符串(如 PEM 格式证书),加
-w 0关闭自动折行,或先用tr -d '\n'清理 - 若数据混有 HTML 实体、URL 编码字符或空格,必须先清洗;可用
-i参数跳过非法字符,但仅限调试,生产环境慎用
Go 里 StdEncoding 和 URLEncoding 不能混用
Go 标准库提供两套编码器:base64.StdEncoding(对应 +//)和 base64.URLEncoding(对应 -/_)。用错会导致 illegal base64 data at input byte X。
- HTTP 查询参数、JWT token、HTML data URI 中的 Base64 必须用
URLEncoding,否则+被当空格、/被当路径分隔符 - 邮件 MIME、普通文本传输用
StdEncoding - 解码时必须与编码器严格匹配;没有“自动识别”机制
真正容易被忽略的是:Base64 编码后的长度一定是 4 的倍数,且每 4 字符对应原始数据的 3 字节;如果你看到非 4 倍数长度、或结尾不是 = 却声称是标准 Base64,大概率是 URL 安全变种或已被截断。

















