什么是 TOTP?
TOTP(Time-based One-Time Password),中文为基于时间的一次性密码,是一种动态令牌认证技术。每隔一段时间(通常为30秒),生成一个只能使用一次的验证码,常见于两步验证(2FA)、多因素登录等安全场景,如 Google Authenticator、Microsoft Authenticator 等。
工作原理
-
密钥协商:
- 网站或服务端为用户生成一个唯一的 TOTP 秘钥(通常用 Base32 编码)。
- 用户用扫码(二维码)或手动输入的方式将秘钥导入到 TOTP 客户端(如 Google Authenticator)。
-
验证码生成:
- 客户端与服务端均使用同一秘钥和当前时间,通过 TOTP 算法计算出验证码。
- 验证码每过一个时间窗口(通常30秒)自动更新。
-
认证流程:
- 用户输入当前显示的验证码。
- 服务端用设定的秘钥和当前时间计算验证码,校验一致即认证成功。
核心参数
- 秘钥(Secret Key):分发给用户的唯一秘钥字符串
- 时间步长(Time Step):每隔多少秒更新一次验证码(标准为 30秒)
- 哈希算法:通常为 HMAC-SHA1,有些实现支持 SHA256/512
- 验证码位数:多数为 6 位数字(也可为 8 位)
示例流程
- 服务端生成 Base32 格式密钥,例如:
JBSWY3DPEHPK3PXP
- 用户用 Authenticator App 输入或扫码添加密钥
- 每过30秒,App 显示一组新验证码(如
453297)
- 用户输入验证码登录,服务端实时比对
TOTP 的构造公式(伪代码)
T = floor((当前Unix时间戳 - 起始时间) / 时间步长)
HOTP = HMAC-SHA1(秘钥, T)
截取HOTP结果的后6位(或定制长度)数字为TOTP码
TOTP 的优缺点
| 优势 |
劣势 |
| 不依赖网络(客户端离线也可用,适合手机应用) |
手机丢失、密钥被盗时风险高 |
| 与用户名/密码完全分离,显著提升账户安全性 |
服务器需安全保管秘钥,防止泄漏 |
| 部署灵活,支持第三方认证器App |
部分用户不习惯多因素认证 |
| 符合公开标准,兼容通用 Authenticator 生态 |
仅30s生效,误差过大易造成认证失败 |
安全建议
- 密钥保密:务必服务端安全保存,切勿明文分发或存储
- 时间同步:客户端与服务端时间应严格校准,偏差过大会导致认证失败
- 备份码:建议为用户提供备用恢复码防止设备丢失
- 限制尝试次数:防止爆破攻击
常见应用场景
- 网站/应用的二次验证登录(2FA/MFA)
- 后台运维、开发者工具安全登录
- 管理员、高级权限操作的附加认证
参考资料