TOTP & HOTP
TOTP(基于时间的一次性密码,RFC 6238)和 HOTP(基于 HMAC 的一次性密码,RFC 4226)是每个 2FA 注册 QR 实现的两个 RFC。编码后的 otpauth:// URI 方案是 Google Authenticator 的事实标准,与所有主流验证器应用兼容。
TOTP 规范:RFC 6238(基于时间,2011)。
HOTP 规范:RFC 4226(基于计数器,2005)。
URI 方案:Google Authenticator Key URI Format, 所有验证器应用达成共识的格式。
HOTP 规范:RFC 4226(基于计数器,2005)。
URI 方案:Google Authenticator Key URI Format, 所有验证器应用达成共识的格式。
概述
2FA 注册 QR 是携带共享密钥及标识元数据的 otpauth:// 方案 URL。格式:
otpauth://TYPE/LABEL?secret=SECRET&issuer=ISSUER&algorithm=ALG&digits=N&period=SEC- TYPE,
totp(基于时间)或hotp(基于计数器)。 - LABEL,
Issuer:Account,经过 URL 编码。示例:GitHub:alice@example.com。 - secret, 共享密钥,Base32 编码(RFC 4648 §6 字母表:A-Z、2-7)。
- issuer, 验证器应用中显示的服务名称。与标签冗余,但能改善不解析标签的应用的体验。
- algorithm,
SHA1(默认)、SHA256或SHA512。所有验证器支持 SHA1;支持 SHA256/SHA512 的较少。 - digits,
6(默认)或8。大多数消费者应用期望 6 位。 - period, 仅 TOTP。
30(默认)或60秒。HOTP 使用counter参数替代。
标准测试向量
| 场景 | 输入 | 预期 otpauth:// URI |
|---|---|---|
| TOTP,最简(SHA1,6 位,30 秒) | issuer=GitHub | otpauth://totp/GitHub:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=GitHub |
| TOTP,SHA256,8 位 | issuer=Corp | otpauth://totp/Corp:bob?secret=JBSWY3DPEHPK3PXP&issuer=Corp&algorithm=SHA256&digits=8 |
| HOTP,counter=0 | issuer=YubiKey | otpauth://hotp/YubiKey:carol?secret=JBSWY3DPEHPK3PXP&issuer=YubiKey&counter=0 |
| TOTP,RFC 6238 参考密钥 | issuer=Example | 标准 RFC 测试密钥(12345678901234567890)。T=59 秒时生成 TOTP 94287082。 |
实时 Base32 密钥验证器
验证器应用会拒绝包含 Base32 字母表(A-Z、2-7)以外字符的密钥。以下是 TOTP 生成器内联使用的同一验证器,在浏览器中运行。
请输入密钥进行验证。
常见陷阱
- Base32 不是 Base64。 Base64 使用 A-Z、a-z、0-9、+、/。密钥中出现小写字母或 0、1、8、9 说明传入的是 Base64 字符串,所有合规验证器都会拒绝它。
- 密钥长度。 RFC 4226 §4 建议 HOTP 至少 128 位(26 个 Base32 字符),TOTP 至少 160 位(32 个字符)。80 位(16 字符)以下的密钥技术上合法但会被标记为弱。
- 算法支持因应用而异。 Google Authenticator 忽略
algorithm参数,始终使用 SHA1。要让 SHA256/SHA512 真正生效,用户必须使用 1Password、Authy、Bitwarden 或 Microsoft Authenticator。 - 位数支持因应用而异。 大多数验证器忽略
digits=8,静默截断为 6 位。如果 8 位 OTP 至关重要,请在推广前在目标验证器上测试。 - 标签需要 URL 编码。 issuer 或账户中的特殊字符(
:、@、空格)必须在标签中进行百分号编码,否则旧版验证器会完全丢弃标签。Abundera 自动处理。 - 不要重用密钥。 每个账户需要一个全新的密码学随机密钥。跨服务重用密钥意味着一处泄露,全部失陷。
- 存储比 QR 更重要。 QR 是一次性引导。验证器应用在第一次扫描后存储密钥。如果该密钥后来以明文形式导出(某些验证器会这样做),一次磁盘泄露就能危及所有 2FA。
验证器应用兼容性
| 应用 | TOTP SHA1 | TOTP SHA256/512 | HOTP | 8 位 | 备注 |
|---|---|---|---|---|---|
| Google Authenticator | 是 | 忽略 | 是 | 忽略 | 事实基准。始终以此为第一测试目标。 |
| 1Password | 是 | 是 | 是 | 是 | 完整 RFC 支持。 |
| Authy | 是 | 是 | 否 | 是 | 新版本已移除 HOTP。 |
| Bitwarden | 是 | 是 | 是 | 是 | 完整 RFC 支持。 |
| Microsoft Authenticator | 是 | 是 | 是 | 是 | 完整 RFC 支持。 |
| YubiKey Authenticator | 是 | 是 | 是 | 是 | HOTP 是 YubiKey OATH 的标准模式。 |
| Duo Mobile | 是 | 忽略 | 否 | 忽略 | 使用自己的推送流程,TOTP 仅作备用。 |
另请参见
- /totp-2fa-qr-code/, 内置 Base32 验证器的 TOTP 生成器。
- /hotp-qr-code/, HOTP 计数器变体。
- /standards/, 返回标准索引。