上传文件
  1. base64hub
  2. 其他进制编码
  3. Base64 转 Base32

Base64 转 Base32:用于 TOTP 密钥

粘贴 Base64 密钥,得到相同字节的 RFC 4648 Base32,可直接用于身份验证器应用或 otpauth:// 链接。取消勾选填充后,结果可以直接放进 secret= 参数。

免费 无需注册,不限次数 本地 不上传任何内容 适用于 TOTP otpauth 链接所需的无填充 Base32 更新于 2026年10月27日
输入 0字节 0 B输出 0

在你的浏览器中处理。此页面无法将你的数据发送到任何地方: 我们如何确认

如何将 Base64 转换为 Base32

  1. 把 Base64 粘贴到 输入 · Base64。URL 安全字符(-、_)、缺失的填充和换行都没问题。
  2. 在 输出 · Base32(RFC 4648) 中查看结果。
  3. 如果用于 otpauth:// 链接或身份验证器应用,取消勾选输出下方的 填充(=)。
  4. 点击 复制输出。方向切换中的 Base32(RFC 4648)→ Base64 可以反向转换,Base32 转 Base64 页面也可以。

中间的字节不会改变。输入 20 字节的密钥,输出的也是 20 字节的密钥,工具下方的 字节 计数器会显示这一点。

示例

Base64Base32字节数
iEwO+V01Llzjb4MxBUtgEuCNW8o=RBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K20
iEwO-V01Llzjb4MxBUtgEuCNW8oRBGA56K5GUXFZY3PQMYQKS3ACLQI2W6K20,输入为 URL 安全且无填充
MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ20,RFC 6238 的测试密钥
SGVsbG8h3q2+7w==JBSWY3DPEHPK3PXP10

前几行中的两个字符串看上去毫无相似之处,这很正常: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,再到这里转换。

常见密钥长度对应的字符数

密钥Base64Base32,无填充Base32,带 =
10 字节(80 位)161616
16 字节(128 位)242632
20 字节(160 位)283232
32 字节(256 位)445256

字节数是 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 的浏览量统计以外的网络请求。