加密算法基础95 条

Base32 编码

RFC 4648 定义的编码:每 5 字节编码为 8 个字符,字符集为 A-Z 与 2-7;比 Base64 更长但字符集更易人工抄写与避免混淆。

加密与证书速查安全更新于 2026-10-13

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

维度Base32Base64
字符集A-Z 与 2-7A-Z、a-z、0-9 与 + /
长度约原文的 8/5约原文的 4/3
人工录入字符规整,较易核对更短但更易混淆
典型场景TOTP 密钥、激活码传输与嵌入(JSON、URL 参数)
Base32 是编码而不是加密:任何人都能解码,不能用来保护敏感数据。它在认证场景里的价值,是让共享密钥便于人工录入与核对,机密性仍要依赖上层协议与密钥本身的保护措施。
排查提示:TOTP 不匹配时依次核对三项——密钥是否正确解码、客户端与服务端时间是否同步、算法与验证码位数是否一致。这三项覆盖了绝大多数「验证码不对」的情况,比反复重新扫码或重建密钥更快定位。

易错点

  • 把 Base32 字符串按 Base64 解码 → 字符集不同,得到错误结果或直接报错
  • 录入时忽略空格与大小写 → 密钥被错误解析,验证码始终不匹配
  • 认为 Base32 比 Base64 更安全 → 两者都只是编码,安全性取决于上层协议
  • 忽略填充字符导致长度不对 → 部分实现要求填充完整,缺失时解码失败

数据来源与参考

  • RFC 4648 §6(Base32)
  • RFC 6238(TOTP,Base32 密钥约定)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌