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

Base32 解码器:Base32 转文本或 Hex

粘贴 Base32 字符串,读出解码后的文本。小写、空格和缺少 = 填充都没问题,从设置界面复制来的 2FA 密钥可以原样解码。

免费 无需注册,不限次数 本地 不上传任何内容 宽松解析 不限大小写,可带空格,可省略填充 更新于 2026年10月27日
输入 0字节 0 B输出 0

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

如何解码 Base32

  1. 把字符串粘贴到 输入 · Base32(RFC 4648) 中。大写或小写、分组之间的空格和换行都可以接受,= 填充也可有可无。
  2. 在 输出 · 文本 中读取解码后的文本。默认字符集为 UTF-8;如果文本来自其他系统,请修改输出下方的 字符集。
  3. 如果输出是一堆乱码,说明数据是二进制的。把 到 设为 Hex 或 Base64 查看字节,或点击 保存字节 把它们下载为文件。
  4. 如果输入使用的是其他字母表,请把 从 改为 Base32hex、Crockford Base32 或 z-base-32。
  5. 要编码,请在方向切换中点击 文本 → Base32(RFC 4648),或使用 Base32 编码器。

解码器接受和拒绝什么

解码器对格式很宽松,对内容很严格:

输入结果
JBSWY3DPHello
jbswy3dpHello;大小写无关
JBSW Y3DP EHPK 3PXP10 个字节,hex 为 48656c6c6f21deadbeef
MZXW6YQfoob;缺少填充也没问题
JBSWY3D0错误:位置 8 处出现意外字符 "0"

错误提示指向第一个不在字母表中的字符。出现 0、1、8 或 9,几乎总是说明字符串使用了另一种 Base32 字母表;出现 + 或 /,说明它其实是 Base64,请试试 Base64 解码器。

解码 2FA 或 TOTP 密钥

身份验证器应用在设置时显示的密钥(常常分组显示为 jbsw y3dp ehpk 3pxp)就是 RFC 4648 Base32。解码后得到原始的 HMAC 密钥,它是随机字节,所以请以 Hex 而不是 文本 查看。长度能告诉你密钥大小:16 个字符是 10 字节,32 个字符是 20 字节(160 位,RFC 4226 推荐的大小),52 个字符是 32 字节。

要确认密钥是否正确,可以用它生成一个验证码。下面这个 Python 函数以同样宽松的方式解码密钥,然后按 RFC 6238 计算:

import base64, hashlib, hmac, struct

def totp(secret, t, digits=6, step=30):
    s = secret.replace(" ", "").upper()
    key = base64.b32decode(s + "=" * (-len(s) % 8))
    mac = hmac.new(key, struct.pack(">Q", t // step), hashlib.sha1).digest()
    off = mac[-1] & 0x0F
    code = struct.unpack(">I", mac[off:off + 4])[0] & 0x7FFFFFFF
    return str(code % 10**digits).zfill(digits)

totp("GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ", 59, 8)   # '94287082'

这个密钥和期望结果 94287082 是 RFC 6238 中的 SHA-1 测试向量。要得到当前的验证码,把 int(time.time()) 作为 t 传入。更多解码写法见 Python 页面。

IPFS CIDv1 及其他带前缀的 Base32

有些格式会在 Base32 前面加一个标记。IPFS CIDv1 字符串以 b 开头,这是不带填充的小写 RFC 4648 Base32 的 multibase 代码:在 bafybei… 中,b 是前缀,afybei… 是数据。去掉 b,解码,然后把 到 设为 Hex。开头的几个字节分别是 CID 版本(01)、内容类型(dag-pb 为 70)和 multihash 头部(32 字节 SHA-256 为 1220)。

Tor v3 洋葱地址的原理相同,只是没有前缀:.onion 之前的 56 个字符是 35 个字节的 Base32,包括 32 字节公钥、2 字节校验和以及一个版本字节(03)。

常见问题

  • Python 抛出 binascii.Error: Non-base32 digit found。输入是小写的。给 b32decode 传入 casefold=True,或者先调用 .upper()。
  • Python 抛出 binascii.Error: Incorrect padding。= 号被去掉了。像上面的函数那样,把长度补到 8 的倍数。
  • base32 -d 提示 invalid input。GNU coreutils 既不接受小写也不接受空格。先清理字符串,或者直接在这里解码。
  • 能解码,但结果不对。Base32hex 和 Crockford 字符串用错误的字母表解码也不会报错。如果来源说是“Base32”,而字符串中没有 0、1、8 或 9,那么 RFC 4648 仍然是最可能的;否则试试另外两种。

常见问题

如何解码 TOTP 密钥?

粘贴密钥(otpauth:// 链接中 secret= 的值,或应用在二维码之外显示的文本密钥),把 到 设为 Hex。结果就是原始的 HMAC 密钥。它是随机字节,所以 文本 输出看起来会是乱码,这很正常。

Python 解码 Base32 时为什么提示 Incorrect padding?

base64.b32decode 要求长度是 8 的倍数。请先补上缺失的 =:s + "=" * (-len(s) % 8)。本解码器不需要填充。

能在这里解码 ULID 吗?

不能直接解码。ULID 使用 Crockford 字母表,但它用 26 个字符编码一个 128 位的数字,开头有 2 个多余的比特。这里的 Crockford 选项从第一个字符开始按比特打包字节,所以对 ULID 会返回错位的字节。

Base32 中哪些字符是无效的?

在 RFC 4648 Base32 中,除 A–Z、2–7 和末尾的 = 以外的任何字符都无效。出现 0、1、8、9 通常说明字符串是 base32hex 或 Crockford;切换 从 试试它们。