Base32 是什么
Base32 是 RFC 4648 定义的编码方式:用 A-Z 与 2-7 共 32 个字符表示数据,每 5 个字节编码为 8 个字符,因此体积比原文膨胀约 60%,明显长于 Base64。它的优势是字符集更规整、不含易混淆符号,人工抄写与口述时出错概率更低,常见于双因素认证密钥、部分激活码等需要人工传递的场景。
基本信息
| 标准 | RFC 4648 §6 |
|---|---|
| 字符集 | A-Z 与 2-7,等号用于填充 |
| 膨胀比 | 约 8/5,比原文长 60% |
| 典型用途 | TOTP 密钥、部分激活码、某些匿名服务地址 |
| 与 Base64 的差别 | Base64 更短,但含大小写字母与 + / 符号,人工录入更易出错 |
典型使用场景
- 双因素认证(TOTP)共享密钥的分发与手工录入
- 需要口头或纸质传递的激活码与恢复码
- 排查「密钥录入后验证码始终不对」:多为空格、大小写或编码方式混用
- 与二维码配合:把 Base32 字符串编进 otpauth 链接
- 接收第三方数据时先判断字符集对应哪种编码
编解码示例
编解码示例
import base64
print(base64.b32encode(b'hello')) # NBSWY3DP
print(base64.b32decode('NBSWY3DP')) # b'hello'
# 手工录入场景:先剥离空格并统一大小写
key = 'JBSW Y3DP EHPK 3PXP'.replace(' ', '').upper()
print(len(base64.b32decode(key))) # 16 字节
# 注意:不同系统的分组展示方式不同,解析前要统一处理空白字符Base32 与 Base64
| 维度 | Base32 | Base64 |
|---|---|---|
| 字符集 | A-Z 与 2-7 | A-Z、a-z、0-9 与 + / |
| 长度 | 约原文的 8/5 | 约原文的 4/3 |
| 人工录入 | 字符规整,较易核对 | 更短但更易混淆 |
| 典型场景 | TOTP 密钥、激活码 | 传输与嵌入(JSON、URL 参数) |
Base32 是编码而不是加密:任何人都能解码,不能用来保护敏感数据。它在认证场景里的价值,是让共享密钥便于人工录入与核对,机密性仍要依赖上层协议与密钥本身的保护措施。
排查提示:TOTP 不匹配时依次核对三项——密钥是否正确解码、客户端与服务端时间是否同步、算法与验证码位数是否一致。这三项覆盖了绝大多数「验证码不对」的情况,比反复重新扫码或重建密钥更快定位。