OTP

TOTP 动态验证码生成

生成基于时间的一次性验证码

密码安全
🔒 100% 本地运行 — 你的数据不会离开当前页面
由 ToolsKit 编辑团队维护最近更新:2026年3月31日最近复核:2026年4月5日
页面模式
Input

Quick CTA

先填 Base32 Secret 或 otpauth URI,首屏直接生成当前 TOTP;参数说明放在 Deep。

Output
Current Code
Next Code
Time Remaining0s
Time Step0
🔒 100% client-side • HMAC-SHA1 (RFC 6238)
页面阅读模式

Deep 展开踩坑、配方、片段、FAQ 与相关工具,适合排查问题或继续深入。

工具说明

该工具可基于 Base32 密钥或 otpauth URI 生成 RFC 6238 标准 TOTP 动态验证码,支持 6/8 位与 30/60 秒周期配置,并显示当前码、下一个码与剩余秒数。适合排查登录双重验证流程、验证后端 OTP 实现、检查二维码绑定参数是否正确。所有 HMAC 计算都在浏览器本地执行。

失败输入样例库

Secret 复制时带空格,Base32 未清洗

失败输入:把文档里的 `JBSW Y3DP EHPK 3PXP` 原样粘贴,包含空格与格式噪声。

失败表现:生成验证码与认证器不一致,团队误以为后端验签逻辑有问题。

修复:先把 secret 归一化为干净 Base32(去隐藏空白),再做验证码对比。

排查 MFA 时忽略时钟偏移

失败输入:客户端本机时间未同步,却直接与线上 NTP 同步服务对比验证码。

失败表现:正确 secret 也会表现为“验证码总是错”,误导排障方向。

修复:先校准客户端与服务端时间,再按当前/相邻时间窗验证。

时钟漂移导致持续校验失败

失败输入:客户端与服务端时间偏差超过一个时间步长。

失败表现:用户输入看似正确验证码却反复失败。

修复:允许小范围容差并持续监控 NTP 健康。

明文存储 TOTP 密钥

失败输入:数据库直接保存原始密钥。

失败表现:一旦泄露可被批量伪造动态码。

修复:密钥静态加密并限制解密链路。

无限次验证码重试

失败输入:校验接口无频率限制。

失败表现:暴力尝试成功概率上升。

修复:增加账号与 IP 双维度限流和锁定策略。

快速决策矩阵

联调真实 MFA 失败链路(前端 + 后端)

建议选:明确 secret、period、digits 并结合日志时间戳做窗口比对。

谨慎用:不要在默认参数不明确、时间未校准的情况下下结论。

设计生产环境 2FA 开通流程

建议选:优先 `otpauth://` + 二维码引导,原始 secret 仅用于受控恢复场景。

谨慎用:避免把原始 secret 暴露在常规流程里,降低截图与剪贴板泄露风险。

将 TOTP 升级为强制二次验证

建议选:密钥分发、时间同步与恢复机制一起设计。

谨慎用:避免无时钟漂移兜底就直接强制开启。

真实用户账号安全体系

建议选:独立密钥 + 加密存储 + 限流校验。

谨慎用:避免共享密钥和无限重试。

短期隔离演示环境

建议选:可简化配置但需明确一次性范围。

谨慎用:避免把演示捷径带入生产认证。

生产可用片段

otpauth 样例

txt

otpauth://totp/ToolsKit:[email protected]?secret=JBSWY3DPEHPK3PXP&issuer=ToolsKit&period=30&digits=6

对比决策

原始 secret vs otpauth URI

原始 secret

适合 secret 已经单独拿到,只需要生成验证码。

otpauth URI

适合完整传递 TOTP 配置。

补充:secret 足够生成验证码,但 URI 会带上更多配置上下文。

单 App 校验 vs 多 App 互通校验

多 App 互通校验

适合面向外部用户的 MFA 流程。

单 App 校验

仅适合内部原型。

补充:互通验证可显著降低上线后兼容工单。

用户独立 TOTP 密钥 vs 团队共享密钥

独立密钥

适合所有真实身份认证系统。

共享密钥

仅适合受控临时实验设备。

补充:共享密钥会失去个人追责与单点撤销能力。

高频问题直答

Q01

它能帮助检查 otpauth URI 吗?

可以,它能把 secret 和时间窗口参数展开,便于快速确认 TOTP 配置。

Q02

为什么生成的验证码这么快就过期?

因为 TOTP 本来就是按时间窗口轮换,目的就是限制重放价值。

失败门诊(高频踩坑)

系统时间不准还在测 TOTP

原因:TOTP 强依赖时间同步,时钟漂移会让正确 secret 看起来像坏的。

修复:先确认设备和系统时间同步,再判断验证码是否异常。

场景配方

01

验证一份 TOTP 配置

目标:根据 secret 或 otpauth URI 生成当前验证码,检查配置是否看起来正常。

  1. 粘贴 Base32 secret 或 otpauth URI。
  2. 生成当前和下一窗口验证码。
  3. 和认证器或联调系统对照。

结果:你可以更快判断问题是 secret 格式、时间窗口,还是认证系统本身。

02

多认证器 TOTP 入网冒烟测试

目标:确保种子在主流认证器上生成一致 OTP。

  1. 生成测试种子并导入多个认证器。
  2. 在统一时钟下按间隔比对 OTP。
  3. 记录偏差并补充入网指引。

结果:上线前暴露兼容问题,降低客服压力。

03

TOTP 上线前 2FA 兼容验证

目标:确认不同认证器应用生成一致一次性口令。

  1. 核对密钥编码与 issuer/account 标签格式。
  2. 验证 30 秒窗口下的设备与服务端时钟一致性。
  3. 准备时钟漂移或设备丢失时的恢复路径。

结果:2FA 启用流程跨设备更稳定、可预期。

04

MFA 开通上线流程

目标:让 TOTP 开通可用、可恢复、可支持。

  1. 每个账号生成独立密钥并提供二维码。
  2. 至少一次校验成功后再正式启用。
  3. 发放恢复码并加密保存密钥元信息。

结果:MFA 上线后更安全也更易运维。

05

设备时钟漂移支持策略

目标:降低因时间偏差造成的误失败。

  1. 记录校验窗口和失败原因。
  2. 在限流前提下允许窄范围相邻时间步。
  3. 连续漂移时提示用户校准设备时间。

结果:登录体验改善且安全边界可控。

实操指南

TOTP 动态验证码生成 更适合放在真实输入与发布决策链路中使用,优先关注「联调真实 MFA 失败链路(前端 + 后端)」这类高风险场景。

适用场景

  • 当场景是 联调真实 MFA 失败链路(前端 + 后端) 时,可优先采用:明确 secret、period、digits 并结合日志时间戳做窗口比对。。
  • 当场景是 设计生产环境 2FA 开通流程 时,可优先采用:优先 `otpauth://` + 二维码引导,原始 secret 仅用于受控恢复场景。。
  • 在 原始 secret vs otpauth URI 场景下先对比 原始 secret 与 otpauth URI 再落实现。

快速步骤

  1. 粘贴 Base32 secret 或 otpauth URI。
  2. 生成当前和下一窗口验证码。
  3. 和认证器或联调系统对照。

避免踩坑

  • 常见失败:生成验证码与认证器不一致,团队误以为后端验签逻辑有问题。
  • 常见失败:正确 secret 也会表现为"验证码总是错",误导排障方向。

常见问题

什么是 TOTP?

TOTP 是基于时间步长生成一次性验证码的标准,常用于双重验证。

可以直接粘贴 otpauth URI 吗?

可以,工具会自动解析其中的 secret、digits 和 period 参数。

为什么和手机验证器的结果不一致?

通常是密钥、位数、周期或设备时间不同步导致,需要逐项核对。

TOTP 和短信验证码一样吗?

不一样。TOTP 由本地算法生成,短信验证码由服务端下发。

验证码会自动刷新吗?

会,页面会根据倒计时更新当前码和下一码。

Secret 会上传到服务器吗?

不会,解析和计算都在浏览器本地完成。