跳转到主要内容

TOTP

本文约需 2 分钟阅读

TOTP (Time-based One-Time Password) 是一种基于当前时刻生成的一次性密码机制。它在 Google Authenticator、Microsoft Authenticator 等身份验证应用中被广泛使用。通常每 30 秒生成一个新的 6 位代码,作为附加在密码之上的两步验证要素发挥作用。截至 2024 年,TOTP 是采用最广泛的两步验证方式,Google、GitHub、AWS 等主流服务大多已支持。

即使强制要求也依然存在的三个前提

要求必须使用的决定,往往以完成设置的人数来衡量,但真正决定实际状态的是其背后仍然存在的三个前提。第一,一次完成的登记并不会永久有效。更换终端、更换机型、重新安装应用时,登记都要重做,而在这一过程中就需要用另一种手段来证明本人身份。如果重做的路径比原本的手续更简单,那条路径就成了真正的入口。因此,强制要求的效果,与其取决于登记是否完成,不如取决于重做时要求什么。第二,符号在短时间内轮换所能防止的,是事后被反复使用,而不是收到之后立即被使用。在同一周期内同一符号仍然有效,因此如果已经输入的符号被别人当场拿去使用,轮换的速度就起不了作用。基于时间的机制缩短的是被窃取符号的寿命,而不是消除被窃取的路径本身。第三,要求所适用的范围,与人员名单并不一致。对经由界面进入的路径可以提出要求,但为机器之间交互而另行签发的凭据,以及仍按旧手续保留的入口,可能并不在同一要求的范围内。让所有人都完成设置这一状态,并不等于在所有入口都被要求这一状态。前者可以对照名册核实,后者则必须清点入口本身才能知道。

TOTP 生成流程

共享密钥
当前时刻 (30 秒为单位)
HMAC-SHA1 计算
生成 6 位代码

TOTP 的工作原理

TOTP 是在 RFC 6238 中标准化的算法。它以服务器和客户端共享的密钥与当前时刻作为输入,用 HMAC-SHA1 计算哈希值,并从中提取出 6 位数字。只要服务器和客户端的时钟同步,就会生成相同的代码,从而完成身份验证。

具体的应用场景

一个常见的误解是“短信验证和 TOTP 的安全级别相同”。短信验证存在被 SIM 卡交换攻击或 SS7 协议漏洞利用而遭到拦截的风险。由于 TOTP 在设备内部完成,因此对这些攻击的防护要安全得多。NIST (美国国家标准与技术研究院) 也建议使用 TOTP 或硬件密钥,而非短信验证。

将密码管理器生成的强密码与 TOTP 相结合,即使密码泄露也能防止非法登录。请将 TOTP 的密钥与备份代码一起安全保管。为应对运行身份验证应用的智能手机丢失的情况,将备份代码打印在纸上保存在保险箱中,或在多台设备上设置身份验证应用,是实务上的最佳实践。

相关术语

这篇文章对您有帮助吗?