Base32 编码解码

将文本、十六进制字节或文件转换为 Base32,也可以反向解码。支持 RFC 4648 标准字母表、Base32hex、Crockford 和 z-base-32,并可控制填充和大小写。

完全在浏览器中运行,不会上传任何数据。

使用方法

  1. 选择“编码”把文本转换为 Base32,或选择“解码”把 Base32 还原为文本。
  2. 选择变体。默认的 RFC 4648 是 TOTP 密钥和大多数程序库使用的标准。
  3. 输入或粘贴内容,也可以打开文件,结果会随输入实时更新。
  4. 复制结果,或将结果下载为文件。

什么是 Base32?

Base32 使用 32 个可打印字符来表示二进制数据。每个字符承载 5 位,因此每 5 个字节会变成 8 个字符。编码后体积约增加 60%,比 Base64 更大,但字母表只有一种大小写,并且去掉了容易混淆的字符。

RFC 4648 定义的标准字母表由 A-Z 和数字 2-7 组成,没有使用 0、1、8、9,以免与字母 O、I、B 混淆。当输入长度不是 5 字节的整数倍时,输出会用 = 填充到 8 个字符的整数倍。

Base32 的常见用途

  • 两步验证。身份验证器应用中的 TOTP、HOTP 密钥(otpauth:// 链接里的 secret= 参数)就是 Base32 字符串。
  • 不区分大小写的系统。由于只有一种大小写,Base32 可以安全地用于忽略大小写的文件系统、DNS 标签和邮箱地址。
  • 需要人工输入的编码。许可证密钥、洋葱地址和短标识符常用 Base32,便于朗读和手动输入。

如果更在意体积,Base64 更紧凑;如果需要不易混淆的短 ID,可以比较 Crockford Base32 和 Base58。

Base32 的几种变体

变体字母表典型用途
RFC 4648A-Z 2-7TOTP 密钥、通用场景
Base32hex0-9 A-V排序与原始字节一致,DNSSEC NSEC3
Crockford0-9 A-Z,去掉 I、L、O、U易读 ID、ULID
z-base-32小写、重新排列面向人工阅读的密钥、OpenPGP WKD、ZRTP

在代码中使用 Base32

# Python
import base64
base64.b32encode(b'hello')        # 编码
base64.b32decode('NBSWY3DP')      # 解码

// Node.js 没有内置 Base32,可使用 "hi-base32" 等第三方包
// Go (import "encoding/base32")
base32.StdEncoding.EncodeToString(data)

编码规格

字母表A-Z 2-7
输出体积每 5 字节输出 8 个字符(160%)
填充用 = 补足到 8 的倍数
标准RFC 4648 第 6 节
区分大小写否

编码示例

输入 (UTF-8)输出
Hello, World!JBSWY3DPFQQFO33SNRSCC===
Base64.isIJQXGZJWGQXGS4Y=
你好4S62BZNFXU======

常见问题

Base32 区分大小写吗?

RFC 4648 字母表以大写定义,但本工具解码时同样接受小写输入。如果需要小写输出,可以勾选“小写”选项。

为什么 Base32 结果末尾有等号?

等号是填充字符,用于把最后一组补足 8 个字符。包括大多数 TOTP 应用在内的很多系统都接受不带填充的 Base32,关闭“填充”即可去掉等号。

Base32 编码后体积会增加多少?

每 5 个字节变成 8 个字符,因此 Base32 输出约为原数据的 1.6 倍,而 Base64 约为 1.33 倍。

可以用这个工具解码 TOTP 密钥吗?

可以。把密钥粘贴到“解码”中,并将输出设为“十六进制”,即可看到原始密钥字节。密钥中的空格会被自动忽略。