TOTP(基于时间的一次性密码)
TOTP 是基于共享密钥和时间窗口生成一次性验证码的机制,常用于认证器 App 形式的 MFA。
#type / concept
#status / evergreen
#tech / security
#resource / totp
#resource / otp
[!info] related notes
- 所属 MOC: 安全 MOC
- 前置概念: 多因素认证(MFA), 密码学
- 并列概念: 虚拟 MFA
- 易混淆概念: HOTP
- 关系笔记: 虚拟 MFA、短信 MFA、Push MFA 与 WebAuthn / Passkey 的安全边界
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,但两者不完全等价:前者是机制,后者是产品形态。