首页 / 技术分享 / 自建 TOTP 微服务 /
TOTP - 基于时间的一次性密码

TOTP - 基于时间的一次性密码

码不停提

2026-01-28
78 次浏览
0 条评论

TOTP 属于 IETF RFC 6238 标准协议,是 HOTP(基于计数器的一次性密码,RFC 4226)的升级版本。

自建 TOTP 微服务
2FA
TOTP
Authenticator
分享:

什么是 TOTP?

TOTP(Time-based One-Time Password),中文为基于时间的一次性密码,是一种动态令牌认证技术。每隔一段时间(通常为30秒),生成一个只能使用一次的验证码,常见于两步验证(2FA)、多因素登录等安全场景,如 Google Authenticator、Microsoft Authenticator 等。

工作原理

  1. 密钥协商

    • 网站或服务端为用户生成一个唯一的 TOTP 秘钥(通常用 Base32 编码)。
    • 用户用扫码(二维码)或手动输入的方式将秘钥导入到 TOTP 客户端(如 Google Authenticator)。
  2. 验证码生成

    • 客户端与服务端均使用同一秘钥和当前时间,通过 TOTP 算法计算出验证码。
    • 验证码每过一个时间窗口(通常30秒)自动更新。
  3. 认证流程

    • 用户输入当前显示的验证码。
    • 服务端用设定的秘钥和当前时间计算验证码,校验一致即认证成功。

核心参数

  • 秘钥(Secret Key):分发给用户的唯一秘钥字符串
  • 时间步长(Time Step):每隔多少秒更新一次验证码(标准为 30秒)
  • 哈希算法:通常为 HMAC-SHA1,有些实现支持 SHA256/512
  • 验证码位数:多数为 6 位数字(也可为 8 位)

示例流程

  1. 服务端生成 Base32 格式密钥,例如:JBSWY3DPEHPK3PXP
  2. 用户用 Authenticator App 输入或扫码添加密钥
  3. 每过30秒,App 显示一组新验证码(如 453297
  4. 用户输入验证码登录,服务端实时比对

TOTP 的构造公式(伪代码)

T = floor((当前Unix时间戳 - 起始时间) / 时间步长)
HOTP = HMAC-SHA1(秘钥, T)
截取HOTP结果的后6位(或定制长度)数字为TOTP码

TOTP 的优缺点

优势 劣势
不依赖网络(客户端离线也可用,适合手机应用) 手机丢失、密钥被盗时风险高
与用户名/密码完全分离,显著提升账户安全性 服务器需安全保管秘钥,防止泄漏
部署灵活,支持第三方认证器App 部分用户不习惯多因素认证
符合公开标准,兼容通用 Authenticator 生态 仅30s生效,误差过大易造成认证失败

安全建议

  • 密钥保密:务必服务端安全保存,切勿明文分发或存储
  • 时间同步:客户端与服务端时间应严格校准,偏差过大会导致认证失败
  • 备份码:建议为用户提供备用恢复码防止设备丢失
  • 限制尝试次数:防止爆破攻击

常见应用场景

  • 网站/应用的二次验证登录(2FA/MFA)
  • 后台运维、开发者工具安全登录
  • 管理员、高级权限操作的附加认证

参考资料


评论区 (0)

你需要先 登录 后才能发表评论。
还没有人评论,赶快成为第一个吧。