认证与密码
TOTP (基于时间的一次性密码)
约 4 分钟阅读
最后更新: 2026-02-20
什么是 TOTP
TOTP (Time-based One-Time Password) 是一种将当前时间与共享密钥组合,每隔固定时间 (通常 30 秒) 生成新的 6 位一次性密码的算法。在 RFC 6238 中标准化,作为双因素认证的实现方式被广泛采用。
Google Authenticator、Microsoft Authenticator、Authy 等认证应用使用这一机制。登录服务时除密码外输入认证应用显示的 6 位验证码,即使密码泄露也能防止未授权登录。
TOTP 的工作原理
TOTP 的工作原理简单而稳健。
- 共享密钥:在服务上设置 TOTP 时,服务器生成密钥 (通常是 Base32 编码的 160 位值)。该密钥以二维码形式显示,认证应用扫描后保存
- 计算时间计数器:将当前 Unix 时间戳除以 30 的整数值作为计数器。由于服务器和应用参考相同时间,得到相同的计数器值
- 通过 HMAC-SHA1 生成:将密钥和计数器值输入 HMAC-SHA1 算法生成哈希值。从该哈希值中动态提取 6 位数字
- 验证:服务器端执行相同计算,验证用户输入的验证码是否匹配。考虑到时间偏差,通常也接受前后 1-2 步的验证码
密钥不会在网络上传输,生成的验证码 30 秒后即失效。即使在钓鱼网站上输入验证码,攻击者能重用的时间窗口也极为有限。
与 SMS 认证的比较
虽然 SMS 认证也被广泛用于双因素认证,但 TOTP 在安全性方面更为优越。
- 抵御 SIM 卡交换攻击:SMS 认证容易受到攻击者欺骗运营商转移电话号码的 SIM 卡交换攻击。TOTP 使用设备内的密钥生成,电话号码被劫持也无法突破
- 通信通道安全性:SMS 可能因 SS7 协议漏洞被拦截。TOTP 不需要网络通信,没有被拦截的风险
- 离线工作:TOTP 在设备离线时也能生成验证码。SMS 在无信号区域无法接收
- 成本:SMS 发送对服务提供商产生成本。TOTP 仅需服务器端计算即可完成
但 TOTP 也有弱点。对实时钓鱼攻击 (攻击者将输入的验证码立即转发到合法网站的中继型钓鱼) 是脆弱的。对此,通行密钥等具有防钓鱼能力的认证方式是有效的。
认证应用的选择与备份
选择认证应用时最重要的是备份功能。如果因设备丢失或故障无法访问认证应用,将面临无法登录所有已注册服务的风险。
- Authy:支持云备份和多设备同步。设备丢失时恢复容易
- Microsoft Authenticator:支持备份到 iCloud / Google 账户。与企业环境兼容性强
- Google Authenticator:支持同步到 Google 账户 (2023 年以后)。简洁轻量
- 1Password / Bitwarden:可在密码管理器中统一管理 TOTP。便利性高,但将密码和 TOTP 保存在同一处,严格来说降低了双因素的独立性
无论选择哪个应用,TOTP 设置时显示的恢复码 (备份码) 务必保存在安全的地方。建议打印在纸上放入保险箱或保存在加密文件中。
常见误解
- 设置 TOTP 就能完全防止钓鱼
- TOTP 作为密码泄露的防御是有效的,但对实时中继型钓鱼 (攻击者将输入的验证码立即转发到合法网站) 是脆弱的。需要完全防钓鱼能力时请使用通行密钥或 FIDO2 安全密钥。
- 认证应用的验证码是设备专属的,其他人无法生成
- TOTP 验证码由密钥和当前时间计算得出,知道密钥的人都能生成相同的验证码。不要向他人展示二维码截图或密钥字符串。
TOTP 与 SMS 认证的比较
TOTP (认证应用)
在设备内生成。抵御 SIM 卡交换攻击。离线可用。需要备份密钥。
SMS 认证
发送到手机号。容易受到 SIM 卡交换攻击。需要信号。有手机号即可使用,导入容易。
分享