使用方法
- 将服务两步验证页面上显示的密钥输入到输入框中,或粘贴其二维码中包含的 otpauth:// 文本。按显示可核对所输入的内容。
- 选择服务所指定的哈希算法、位数和周期。许多服务使用密钥 URI 格式的默认值:SHA-1、6位和30秒。
- 对于基于计数器的服务,选择基于计数器(HOTP)并输入计数器;计数器 + 1 可使其前进。
- 在剩余时间耗尽之前使用当前验证码;若您设备的时钟略有偏差,请核对上一个和下一个验证码。
验证码如何生成
HOTP(RFC 4226)以密钥和计数器为输入,对计数器计算带有所选哈希算法的 HMAC,并取其中四个字节(动态截断)。这四个字节所表示的数,对10的位数次方取模,即为验证码。
TOTP(RFC 6238)是以时间生成计数器的 HOTP:即 Unix 时间(秒)除以周期后向下取整。每个周期开始一个新的验证码,因此双方都需要准确的时钟。
TOTP = HOTP(key, floor(unix time / period)); HOTP = truncate(HMAC(key, counter)) mod 10^digits
密钥与 otpauth:// 链接
密钥是 Base32 文本(RFC 4648):字母 A 至 Z 与数字2至7。空格会被忽略,末尾的填充可以省略。含有该字符集以外字符,或长度不可能的密钥,会被拒绝。
otpauth:// 链接(Google 的密钥 URI 格式)包含类型、标签和密钥,以及可选的发行方、算法、位数、周期和计数器。缺少的设置采用该格式的默认值:SHA1、6位、30秒,计数器为0。
本页面如何校验
验证码已用 RFC 4226 附录 D 的测试值(计数为0至9)以及 RFC 6238 附录 B 的测试值(六次,分别针对 SHA-1、SHA-256 和 SHA-512,并使用8位)进行测试。HMAC 由您的浏览器的 SubtleCrypto 计算。
计算示例:RFC 6238 的测试密钥
RFC 的测试密钥为文本12345678901234567890,用 Base32 表示即 GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ。在 Unix 时间59、周期为30秒的条件下,TOTP 的第1步在 SHA-1 下得出8位验证码94287082。
若取6位,同一步的结果为287082,即 RFC 4226 计数器1的验证码,也就是8位值的最后六位。
常见问题
密钥或验证码会被发送到服务器吗?
不会。验证码在您的浏览器中计算,页面不发出任何包含密钥或验证码的请求。没有任何内容被保存,刷新页面即会将两者都遗忘。
我应该把真实账户的密钥粘贴到这里吗?
只能在您信任的页面上,并且只在没有其他人能看到您屏幕的时候。真实账户通常应使用您的验证器应用,因为它会为日常使用保存密钥;本页面适合您自己的工具,以及只需使用一次的验证码。
为什么验证码每30秒变化一次?
基于时间的验证码(TOTP)使用自 Unix 纪元以来的周期数,因此每个周期都会开始一个新的验证码。倒计时显示当前验证码还能使用多久。
为什么我的验证码与服务商的应用不一致?
请核对密钥(只能是 Base32)、哈希算法、位数和周期,这些都由服务商指定;然后核对设备的时钟是否正确,因为基于时间的验证码依赖于它。上一个和下一个验证码有助于发现小的时钟偏差。
应该选择哪种哈希算法?
选择服务商所声明的那一种。SHA-1 是 RFC 4226 HOTP 和 otpauth 格式的默认值;RFC 6238 也允许 TOTP 使用 SHA-256 和 SHA-512。
TOTP 与 HOTP 有什么区别?
TOTP 使用时间,因此验证码随每个周期变化。HOTP 使用计数器,每次使用后计数器前进,因此在计数器改变之前,验证码保持不变。
otpauth:// 文本有什么作用?
它以密钥 URI 格式携带两步验证密钥的设置,通常包含在二维码中。把它粘贴到这里,即可自动填入密钥、哈希算法、位数、周期和计数器。
资料来源
- RFC 4226:HOTP,基于 HMAC 的一次性口令算法(IETF,英文)
- RFC 6238:TOTP,基于时间的一次性口令算法(IETF,英文)
- RFC 4648:The Base16, Base32, and Base64 Data Encodings(IETF,英文)
- Google Authenticator:Key Uri Format(英文)
- MDN:SubtleCrypto.sign()(英文)
数据和文字最近核对于2026年11月10日星期二。