请输入有效的密钥以查看验证码。
按服务器的方式检查验证码:接受当前验证码以及前后最多 2 个步长内的验证码,以容忍时钟偏差。
工作原理
TOTP(Time-based One-Time Password,RFC 6238)是 Google Authenticator、Microsoft Authenticator、Authy 或 1Password 中六位验证码背后的算法。服务和你的手机共享一个密钥;每 30 秒,双方都用密钥和按步长划分的当前时间计算 HMAC,截取为六位数字并比较结果。由于在你输入之前验证码不会被传输,即使手机没有网络连接也能使用。
HOTP(RFC 4226)是基础算法:它不使用时间,而是使用每次请求验证码时递增的计数器。TOTP 就是把计数器替换为自 1970 年以来经过的周期数的 HOTP。密钥以 Base32 表示,包含在 otpauth:// URI 中,在开启两步验证时以 QR 码形式显示。
本工具使用浏览器的加密随机数生成器生成密钥,计算当前、上一个和下一个验证码,构建 URI 及其 QR 码,读取现有 URI,并以与服务器相同的时钟偏差容限验证验证码。密钥永远不会离开你的浏览器,也不会包含在分享链接中。
示例
GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ · SHA1 · 8 · T = 59 s94287082RFC 6238 的测试向量。密钥是 ASCII 文本 12345678901234567890 的 Base32 编码;在 Unix 纪元后第 59 秒,步长为 1,八位验证码必须正好是这个值。GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ · SHA1 · 8 · T = 1111111109 s07081804RFC 6238 的另一个向量,可用于检查你的实现是否丢失了前导零:验证码是固定位数的数字串,而不是整数。HOTP · GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ · contador 0755224RFC 4226 的第一个六位向量。计数器为 1 时,验证码变为 287082。otpauth://totp/Ejemplo:ana%40example.com?secret=JBSWY3DPEHPK3PXP&issuer=EjemploTOTP · SHA1 · 6 · 30 s由 Google Authenticator 定义并被其他应用采用的 Key URI 格式。如果缺少 algorithm、digits 和 period,则默认为 SHA1、6 和 30,因此大多数 QR 码只包含密钥和发行方。使用场景
- 测试应用的 2FA 开启流程:生成密钥,用手机扫描 QR 码,确认服务器接受与应用显示相同的验证码。
- 排查服务器为何拒绝有效验证码:查看是否与上一个或下一个步长的验证码匹配,即可发现时钟偏差。
- 使用 RFC 6238 和 4226 的测试向量验证自己的 TOTP 或 HOTP 实现。
- 读取从其他应用导出的 otpauth:// URI,查看账户使用的算法、位数和周期。
- 将已有 Base32 密钥的测试账户添加到第二个应用或密码管理器中。
常见问题
为什么服务器会拒绝应用中显示为有效的验证码?
几乎总是时钟问题。TOTP 依赖手机和服务器的时间一致:相差 30 秒就会计算出不同的步长。因此服务器会在两侧各接受一到两个步长。如果验证码与上一个或下一个步长匹配,请用 NTP 同步服务器时间,并开启手机的自动时间设置。
在这里为真实账户生成密钥安全吗?
密钥由 crypto.getRandomValues 生成,不会离开你的浏览器,但在生产环境中,应由负责验证验证码的服务器生成并保存。本工具用于测试和调试。请像对待密码一样对待任何真实密钥:拥有它的人可以永久生成你的验证码。
应该使用 SHA-256、8 位数字或 60 秒吗?
理论上它们更强,但包括某些版本的 Google Authenticator 在内的多个应用会忽略这些参数,始终以 SHA-1、6 位、每 30 秒计算,导致用户看到的验证码被服务器拒绝。SHA-1 作为 HMAC 仍然是安全的。出于兼容性考虑,几乎所有服务都使用默认值。
密钥应该有多长?
RFC 4226 要求至少 128 位,推荐 160 位,即 Base32 下的 32 个字符。许多服务使用 80 位(16 个字符),应用同样可以接受。本工具生成 160 位。
TOTP 能防御网络钓鱼吗?
不能完全防御。它比短信好得多,短信可能被拦截或通过 SIM 卡劫持窃取,但虚假网站可以诱导你输入验证码,并在同一个 30 秒内在真实网站上使用。FIDO2 安全密钥和通行密钥与域名绑定,可以抵御这种攻击。
手机丢了怎么办?
没有密钥就无法计算验证码。因此,服务在开启 2FA 时会提供恢复码:请将它们保存在手机以外的地方。有些应用允许将账户加密备份到云端,或导出为 QR 码以迁移到其他设备。