使用方法
- 选择“编码”把文本转换为 Base32,或选择“解码”把 Base32 还原为文本。
- 选择变体。默认的 RFC 4648 是 TOTP 密钥和大多数程序库使用的标准。
- 输入或粘贴内容,也可以打开文件,结果会随输入实时更新。
- 复制结果,或将结果下载为文件。
什么是 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 4648 | A-Z 2-7 | TOTP 密钥、通用场景 |
| Base32hex | 0-9 A-V | 排序与原始字节一致,DNSSEC NSEC3 |
| Crockford | 0-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.is | IJQXGZJWGQXGS4Y= |
你好 | 4S62BZNFXU====== |
常见问题
Base32 区分大小写吗?
RFC 4648 字母表以大写定义,但本工具解码时同样接受小写输入。如果需要小写输出,可以勾选“小写”选项。
为什么 Base32 结果末尾有等号?
等号是填充字符,用于把最后一组补足 8 个字符。包括大多数 TOTP 应用在内的很多系统都接受不带填充的 Base32,关闭“填充”即可去掉等号。
Base32 编码后体积会增加多少?
每 5 个字节变成 8 个字符,因此 Base32 输出约为原数据的 1.6 倍,而 Base64 约为 1.33 倍。
可以用这个工具解码 TOTP 密钥吗?
可以。把密钥粘贴到“解码”中,并将输出设为“十六进制”,即可看到原始密钥字节。密钥中的空格会被自动忽略。