TOTP(基于时间的一次性密码)

TOTP 是基于共享密钥和时间窗口生成一次性验证码的机制,常用于认证器 App 形式的 MFA。

#type / concept #status / evergreen #tech / security #resource / totp #resource / otp

[!info] related notes

TOTP(基于时间的一次性密码)

一句话定义

TOTP 是一种基于共享密钥和当前时间窗口计算一次性验证码的机制,常见表现是认证器 App 每 30 秒变化一次的 6 位数字。

核心机制 / 工作原理

TOTP 依赖三样东西:

  • 共享密钥 secret
  • 当前时间片 floor(unixTime / period)
  • HMAC 哈希算法

可以抽象成:

TOTP = Truncate(HMAC(secret, timeStep))

典型参数是:

  • 算法:HMAC-SHA1
  • 位数:6 位
  • 周期:30 秒

认证器和服务端都持有同一个 secret,也都知道当前时间,所以能在同一时间片算出同一个验证码。这也是为什么认证器 App 离线也能工作。

TOTP 和 HOTP 的关系是:

HOTP = HMAC(secret, counter)
TOTP = HOTP(secret, timeCounter)

也就是用“时间片”替代“递增计数器”。

工程上常见的几个关键点:

  • 服务端会容忍前后时间窗口,例如 T-1 / T / T+1
  • 成功使用过的时间片应记录,避免同一窗口内重放
  • secret 不能只存哈希,因为服务端需要重新计算验证码
  • secret 应加密存储,并由 KMS 或等价机制管理密钥

最小例子 / 最小场景

用户绑定 TOTP
-> 服务端生成 secret
-> 把 otpauth URI 做成二维码
-> 认证器 App 扫码保存 secret
-> 登录时用户输入 6 位动态码
-> 服务端用同一 secret 和当前时间验证

边界与易混淆点

  • TOTP 不是“服务端发来的验证码”,而是客户端和服务端各自本地计算出的相同结果。
  • TOTP 不是加密算法本身,而是把 HMAC、共享密钥和时间窗口组合成认证方案。
  • TOTP 能显著降低密码单点失守风险,但不天然抗实时钓鱼。
  • 如果 secret 泄露,攻击者就能离线生成正确验证码,MFA 安全性基本失效。
  • TOTP 常被实现成 虚拟 MFA,但两者不完全等价:前者是机制,后者是产品形态。
创建于 2026/5/18 更新于 2026/5/27