Documentation Index
Fetch the complete documentation index at: https://linserin.dpdns.org/llms.txt
Use this file to discover all available pages before exploring further.
笔者极度厌恶厂商、服务商等强制绑定 OTP 2FA 的做法,故写此文章讲述 OTP 原理。
由于 TOTP 使用广泛,且 TOTP 基于 HOTP 算法,此文章仅讲述 TOTP。查看 Wikipedia 上的 TOTP - 基于时间的一次性密码算法
需要输入:
- 当前时间戳
- 一个通常唯一的用来生产 TOTP 6 位数字的输入,通常为 Base32 编码的随机字符串
开始运算
第一步:生成时间计数器
首先取得当前的 Unix 时间戳,然后除以有效时间步(也就是 TOTP 验证码的有效期,通常为 30 秒),最后取整此结果作为时间计数器 T:第二步:生成哈希值
使用 HMAC-SHA1 算法,以 Base32 解码后的密钥作为密钥,以时间计数器 T(8 字节大端整数)作为消息,进行运算得到一个 20 字节的哈希值 H:虽然默认使用 HMAC-SHA1,但 RFC 6238 明确支持 HMAC-SHA256 / HMAC-SHA512 作为替代方案
第三步:动态截断
从哈希值 H 中提取 4 字节的数字,将其转换为一个 31 位的正整数(最高位设为 0 以确保是正数):- 取 H 最后一个字节的低 4 位作为偏移量 offset
- 从 H[offset] 开始取 4 个字节,拼接成 32 位整数
- 将该整数的最高位设为 0,得到 31 位整数 D