如何把 Base32 转换为 Base64
- 把 Base32 粘贴到 输入 · Base32(RFC 4648) 中。分组之间的空格、小写和缺少的
=都没问题。 - 在 输出 · Base64 中读取 Base64。如果目标不需要
=,请取消勾选输出下方的 填充(=);较长的值可以设置 换行。 - 点击 复制输出。方向切换中的 Base64 → Base32(RFC 4648) 可以反向转换,Base64 转 Base32 也一样。
示例
| Base32 | Base64 | 说明 |
|---|---|---|
JBSWY3DPEHPK3PXP | SGVsbG8h3q2+7w== | Google Authenticator 密钥 URI 文档中的示例密钥,10 个字节 |
jbsw y3dp ehpk 3pxp | SGVsbG8h3q2+7w== | 同一个密钥,应用中常见的分组显示方式 |
GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ | MTIzNDU2Nzg5MDEyMzQ1Njc4OTA= | RFC 6238 的测试密钥,20 个 ASCII 数字 |
RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K | iEwO+V01Llzjb4MxBUtgEuCNW8o= | 20 个看似随机的字节 |
MZXW6YQ | Zm9vYg== | 不带填充的输入;带填充的形式是 MZXW6YQ= |
第一个密钥解码为字节 48 65 6c 6c 6f 21 de ad be ef:单词 Hello! 后面跟着 de ad be ef。所以它的 Base64 以 SGVsbG8h 开头,也就是 Hello! 的 Base64。
为什么要把 2FA 密钥转换为 Base64
Base32 形式是给人用的:它出现在二维码和设置界面中,也能在手机上手动输入。代码和配置通常需要原始密钥,而 Base64 是在 JSON、YAML、环境变量和数据库中存储原始字节的常用方式。典型场景:
- 把一份导出的
otpauth://链接列表中的 TOTP 账户,迁移到以 Base64 存储密钥的系统中。 - 把密钥传给接受 Base64 或字节的 HMAC 函数或库,例如在你自己的服务器上校验验证码时。
- 比较一个密钥的两份副本。同一个 Base32 不管分组、大小写或填充如何不同,都会得到同一个 Base64 字符串,所以输出相同就意味着密钥相同。
Base64 形式的密钥和 Base32 形式的一样敏感,请像存放密码一样存放它。
用 Python 把 Base32 转换为 Base64
Python 的 b32decode 对大小写和填充都很严格,所以要先规范化字符串:
import base64
def b32_to_b64(secret):
s = secret.replace(" ", "").upper()
s += "=" * (-len(s) % 8)
return base64.b64encode(base64.b32decode(s)).decode()
b32_to_b64("jbsw y3dp ehpk 3pxp") # 'SGVsbG8h3q2+7w=='
如果不调用 .upper(),Python 会抛出 binascii.Error: Non-base32 digit found;如果没有补填充那一行,则会抛出 Incorrect padding。Base64 部分见 Python 中的 Base64。
常见问题
- 在
9、8、1或0处报错。这些数字不在 RFC 4648 Base32 中。这个值很可能是 base32hex 或 Crockford;例如91IMOR3F在这里会在位置 1 处报错。请在 Base32 解码器中选择正确的 从 字母表来解码。 - 在
-处报错。有些网站显示的密钥用连字符分隔。请把它们删掉,只有空白会被跳过。 - Base64 是对的,但服务器拒绝验证码。检查其他参数:两端的算法、位数和周期必须一致,而且服务器时钟必须与手机时钟接近。
常见问题
如何把 Google Authenticator 的密钥转换为 Base64?
从 otpauth:// 链接的 secret= 参数中取出密钥(或二维码下方显示的文本密钥),粘贴到这里即可。JBSWY3DPEHPK3PXP 会变成 SGVsbG8h3q2+7w==。
为什么 Base64 比 Base32 短?
Base64 每个字符存储 6 比特,Base32 只存储 5 比特,所以同样的字节需要的 Base64 字符更少:20 个字节是 32 个 Base32 字符,却只要 28 个 Base64 字符。
能在这里转换 base32hex 或 Crockford Base32 吗?
本页只读取 RFC 4648 Base32。请打开 Base32 解码器,把 从 设为 Base32hex 或 Crockford Base32,把 到 设为 Base64。
如何在命令行中把 Base32 转换为 Base64?
使用 GNU coreutils:printf 'JBSWY3DPEHPK3PXP' | base32 -d | base64。输入必须是大写且不含空格;可以先用 tr -d ' ' | tr a-z A-Z 清理一下。