如何将 Base64 转换为 Base32
- 把 Base64 粘贴到 输入 · Base64。URL 安全字符(
-、_)、缺失的填充和换行都没问题。 - 在 输出 · Base32(RFC 4648) 中查看结果。
- 如果用于
otpauth://链接或身份验证器应用,取消勾选输出下方的 填充(=)。 - 点击 复制输出。方向切换中的 Base32(RFC 4648)→ Base64 可以反向转换,Base32 转 Base64 页面也可以。
中间的字节不会改变。输入 20 字节的密钥,输出的也是 20 字节的密钥,工具下方的 字节 计数器会显示这一点。
示例
| Base64 | Base32 | 字节数 |
|---|---|---|
iEwO+V01Llzjb4MxBUtgEuCNW8o= | RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K | 20 |
iEwO-V01Llzjb4MxBUtgEuCNW8o | RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K | 20,输入为 URL 安全且无填充 |
MTIzNDU2Nzg5MDEyMzQ1Njc4OTA= | GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ | 20,RFC 6238 的测试密钥 |
SGVsbG8h3q2+7w== | JBSWY3DPEHPK3PXP | 10 |
前几行中的两个字符串看上去毫无相似之处,这很正常:Base64 每个字符表示 6 位,Base32 每个字符表示 5 位,所以字符永远对不齐。
要避免的错误是把 Base64 字符当作文本来编码。把 iEwO+V01Llzjb4MxBUtgEuCNW8o= 粘贴到文本转 Base32 的编码器里,会得到 NFCXOTZLKYYDCTDM…,这只是那 28 个字符本身的有效 Base32。用它生成的验证码永远对不上服务器。
用 Base64 密钥配置 TOTP
服务端代码常常以 Base64 存储共享密钥,或者用这样的命令生成它:
openssl rand -base64 20
要把它添加到身份验证器应用中,先在这里转换,再构造密钥 URI:
otpauth://totp/Example:alice@example.com?secret=RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K&issuer=Example
algorithm、digits 和 period 可以作为参数添加;不加的话,应用默认使用 SHA-1、6 位数字和 30 秒。用任意本地二维码工具把链接转成二维码,或者让用户手动输入 Base32 密钥。这个密钥与服务器送进 HMAC 的字节完全相同,所以无需改动服务器,验证码就能对上。
如果你需要的是新密钥而不是现有密钥,可以用 随机 Base64 生成器(自定义预设)生成 20 个随机字节的 Base64,再到这里转换。
常见密钥长度对应的字符数
| 密钥 | Base64 | Base32,无填充 | Base32,带 = |
|---|---|---|---|
| 10 字节(80 位) | 16 | 16 | 16 |
| 16 字节(128 位) | 24 | 26 | 32 |
| 20 字节(160 位) | 28 | 32 | 32 |
| 32 字节(256 位) | 44 | 52 | 56 |
字节数是 5 的倍数时,例如 10 和 20,Base32 完全不需要填充。
在 Python 中完成同样的转换
import base64
secret_b64 = "iEwO+V01Llzjb4MxBUtgEuCNW8o="
base64.b32encode(base64.b64decode(secret_b64)).decode().rstrip("=")
# 'RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K'
URL 安全的输入请使用 base64.urlsafe_b64decode,如果填充被去掉了,要先补上 =。更多内容见 Python 中的 Base64。
常见问题
为什么身份验证器应用要用 Base32 而不是 Base64?
应用从二维码读取的 otpauth:// 密钥 URI 格式规定密钥使用 Base32。在扫不了二维码时,密钥还得能手动输入,而 Base32 没有 +、/,也不区分大小写,不容易输错。
Base32 密钥要带 = 填充吗?
在 otpauth:// 链接中不要带:密钥 URI 格式规定应省略填充。取消勾选 填充(=) 即可。20 字节的密钥是 32 个字符,本来就不需要填充。
TOTP 密钥应该多长?
RFC 4226 要求至少 128 位,推荐 160 位,也就是 20 字节:28 个 Base64 字符或 32 个 Base32 字符。
把密钥转换成 Base32 会有安全风险吗?
编码既不增加也不减少任何保护;无论哪种形式,拿到字符串的人都能生成你的验证码。风险在于你把它粘贴到哪里。本页在浏览器中完成转换,其内容安全策略会阻止除 Cloudflare 的浏览量统计以外的网络请求。