Time-based one-time password (TOTP)
· 11 min read
全称 Time-Based One-Time Password 即基于时间的一次性密码,TOTP 属于 OTP 的一种实现方式,基于当前时间与密钥计算的动态密码,通常每 30s 刷新一次。
生成 TOTP 无需网络,前提是当前时间是准确的。服务方与本地生成的 TOTP 相同,则说明校验通过。
Introduce
2FA
全称 Two-Factor Authentication 即双重因素认证。这是一个抽象的概念而不是特定的 算法。
要求用户提供两种不同类型的凭证:
- 第一因素,常见的密码、PIN 码等
- 第二因素,如硬件令牌、指纹或者面部识别等其他固有或拥有的认证方式
其中 OTP 就可以作为 2FA 的第二个因素。当然还有很多其他的验证方式也都能作为第二因素作为校验方式。
OTP
全称 One-Time Password 即一次性密码,仅在一次登录会话或者交易中有效,使用后立即失效。
HOTP
全称 HMAC-Based One-Time Password 即基于计数器的一次性密码算法。
核心原理:
- 共享密钥(Secret Key): 用户和服务端预先共享的一个密钥
- 计数器(Counter): 一个不断递增的数字(每次验证后+1)
公式如下:
HMAC-SHA1(SecretKey, Counter) → 截取6-8位数字
HOTP 的关键在于 Counter 的同步。当出现 Counter 不同步情况的时候,需要额外的手段确保 Counter 同步:
- 服务端窗口,例如服务端允许验证一定范围内的密码[Counter, Counter + N], 然后更新到客户端的 Counter + 1
- 手动同步,如果差距过大,可能需要连续输入两个有效的密码,服务端根据两次密码计算正确的 Counter。
与 TOTP 相比:
特性 | HOTP | TOTP |
---|---|---|
基础机制 | 基于计数器(Counter) | 基于时间(Time) |
密码更新 | 每次使用后计数器+1 | 每 30 秒自动更新(基于时间戳) |
同步要求 | 单向同步 Counter,客户端无需网络 | 需时间同步(允许 ±1 个时间窗口) |
典型应用 | 硬件令牌(如 YubiKey)、离线验证 | 软件认证器(Google Authenticator) |
安全性 | 较高,但可能因计数器不同步失效 | 较高,依赖时间同步 |
触发时机 | 手动触发,更新 Counter | 基于时间自动生成 |
根据 HTOP 的特性可以了解到,服务端需要不断的同步用户本地客户端的 Counter
在实际应用场景中大部分都是使用 TOPT:
- TOTP 安全性更高 TOTP 只在当前时间窗口内生效,过期会自动失效。而 HOTP 在生成密码之后,在计数器递增钱一直有效。
- TOTP 更加方便 HOTP 通常需要物理设备,如 U 盾、令牌等。并且每次生成密码都需要手动的触发。 TOTP 软件即可实现,且密码基于时间自动刷新。