身份验证器应用可以在不接收消息的情况下生成验证码。通过短信发送的验证码则通过投递通道送达,因此设置方式和失败处理有所不同。
每个术语的含义是什么?
OTP 描述的是一次性使用的验证码。HOTP 和 TOTP 描述的是生成该验证码的算法。
| 术语 | 验证码由什么提供 | 用户需要什么 |
|---|---|---|
| OTP | 总称,与生成方式无关 | 取决于所选方式 |
| HOTP | 共享密钥和递增计数器 | 已注册的令牌或应用 |
| TOTP | 共享密钥和当前时间区间 | 已注册且时钟可用的身份验证器 |
RFC 4226 定义了 HOTP 的共享密钥和计数器。RFC 6238 用时间替代该计数器来生成 TOTP。
身份验证器和验证方需要相同的密钥来计算匹配的验证码。在注册和存储过程中保护好该密钥,因为持有它即可生成验证码。
HOTP 如何更换验证码?
令牌在生成验证码时递增计数器。验证方在接受预期验证码后递增其对应的状态。
HOTP 验证码不会仅因时间流逝而过期。生成验证码但不提交会使令牌领先于验证方。
请提供 HOTP 规范要求的计数器重新同步机制。限制搜索后续计数器值的范围,因为接受更多候选值会增加被猜中的机会。
在此过程中限制失败的认证尝试次数。重新同步不能成为无限猜测的途径。
TOTP 如何更换验证码?
TOTP 根据共享密钥和当前时间区间生成验证码,即使没有人请求新验证码也是如此。
RFC 6238 推荐 30 秒的时间步长。显示的验证码会在时钟跨入下一个区间时更新。
在区间即将结束时输入的验证码可能在下一个区间才到达验证方。允许有限的延迟,以免正常的输入时间差导致不必要的失败。
RFC 推荐网络延迟最多允许一个步长。该建议针对的是传输延迟,并非对所有时钟重新同步的通用限制。
保持设备和服务器时钟对齐。较宽的接受窗口能容纳更多时钟漂移,但也会接受更多候选验证码。
即使在时间区间内,也要拒绝已被接受过的验证码。时钟的后续变化本身不能保证一次性使用。
通过 Bird 发送的验证码算 TOTP 吗?
不算。Bird Verify 生成随机验证码,并通过所选通道投递。
接收者无需注册共享的身份验证器密钥即可收到该验证码。其有效性取决于验证流程的过期时间和尝试策略,而非身份验证器的计数器或时钟区间。
为验证流程选择验证码长度、过期时间和尝试次数限制。当接收者反馈延迟时,测量投递和完成间隔。
HOTP 和 TOTP 在注册后于本地生成验证码,因此登录时无需等待消息。其恢复机制则需要考虑身份验证器或共享密钥丢失的情况。
应该选择哪种方式?
- 当流程需要验证用户是否能访问某个可达的号码或地址时,使用已送达的验证码。
- 当用户能够注册并保留一个时钟可靠的身份验证器时,使用 TOTP。
- 当令牌无法依赖时间且你能维护计数器同步时,使用 HOTP。
- 无论哪种方式,都要限制猜测次数、强制一次性使用,并在上线前定义好账户恢复流程。
简而言之
OTP 是总称。
HOTP 和 TOTP 是生成一次性验证码的方式。服务器也可以生成并发送随机验证码。
HOTP 基于计数器。
生成未使用的验证码会使设备领先于验证方。请提供有限范围的重新同步机制。
TOTP 基于时钟。
推荐的时间步长为 30 秒。在考虑输入延迟的同时,不要将接受窗口设置得过宽。
选择注册和恢复模型。
身份验证器验证码需要预先共享的密钥。已送达的验证码需要一个可用的投递通道。