功能说明
Google Authenticator、Microsoft Authenticator、1Password 等双因素认证 App 显示的是每 30 秒变化一次的 6 位验证码。每个验证码都是根据共享密钥算出的一次性密码:TOTP(RFC 6238)基于时间,HOTP(RFC 4226)基于计数器。本工具用同样的方法根据密钥计算验证码,可用来测试双因素认证配置、调试服务器实现,或确认某一时刻的验证码应该是多少。
结果包括当前验证码和实时倒计时,以及上一个和下一个验证码(服务器常常也接受它们,以容忍少量时钟误差)。
使用方法
- 粘贴 Base32 密钥(字母 A–Z 和数字 2–7,空格和大小写不影响),或者粘贴二维码中的完整
otpauth://URI。点击示例可以试用。 - 选择 TOTP 或 HOTP,并设置与账号一致的算法、位数和时间步长。otpauth URI 中的设置优先。
- 使用 HOTP 时输入计数器,点击计数器 +1 逐个查看验证码。
- 复制当前验证码,倒计时显示它还能用多久。
示例
演示密钥 JBSWY3DPEHPK3PXP 是字节 “Hello!” 加上 0xDEADBEEF 的 Base32 形式。下面这个 URI(就是二维码里编码的内容)描述了一个使用它、采用默认设置的账号:
otpauth://totp/Example:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Example&algorithm=SHA1&digits=6&period=30
在 Unix 时间 1700000000,这个密钥对应的验证码是 324 550,当前时间窗口还剩 10 秒。
验证码是怎么算出来的
先把 Base32 密钥解码成字节。TOTP 的计数器是以秒为单位的 Unix 时间除以时间步长后向下取整。计数器写成 8 个字节,用密钥做 HMAC 签名。动态截断根据 HMAC 结果最后半个字节选出其中 4 个字节,再对所需位数取模,保留前导零。
常见问题
› 为什么算出的验证码和身份验证器 App 里的不一样?
TOTP 依赖时钟,先确认设备时间是自动同步的。再确认算法、位数和时间步长与账号一致。大多数服务使用 SHA-1、6 位、30 秒;除非二维码里写明,身份验证器 App 会忽略其他设置。
› TOTP 和 HOTP 有什么区别?
TOTP(RFC 6238)用当前时间除以时间步长作为计数器,所以验证码每 30 秒变化一次。HOTP(RFC 4226)使用一个计数器,每用掉一个验证码就加一。两者都把密钥和计数器做 HMAC,再取最后 6 到 8 位数字。
› 我的密钥会被保存或发送出去吗?
不会。验证码在浏览器中通过 Web Crypto API 计算。密钥不会保存、不会写进地址栏,也不会包含在分享链接里,分享链接只带设置。不过双因素密钥等同于第二重验证本身,请只粘贴属于你自己的密钥。
› 能用它给自己的应用接入双因素认证吗?
可以。点击“随机密钥”生成一个 160 位的 Base32 密钥,把它放进 otpauth:// URI 或二维码交给用户,再把服务器算出的验证码和这里显示的对比。服务器通常还会接受上一个和下一个验证码,以容忍时钟误差。