HOTP
HOTP(HMACベースのワンタイムパスワード、RFC 4226)はTOTPのカウンターベース版です。TOTPが時計で進む一方、HOTPはトークンとサーバーの両方が使用のたびに増やす共有カウンターで進みます。HOTPはYubiKey OATH、レガシーハードウェアトークン、サーバーが時計同期に頼れない一部の銀行フローの標準モードです。
正式仕様:RFC 4226, HOTP: An HMAC-Based One-Time Password Algorithm(2005年)。
URIスキーム:Google Authenticator Key URI Format, すべての認証アプリが合意する
関連仕様:TOTP(RFC 6238), HOTPに基づく時間ベース版。
URIスキーム:Google Authenticator Key URI Format, すべての認証アプリが合意する
otpauth:// スキーム。関連仕様:TOTP(RFC 6238), HOTPに基づく時間ベース版。
概要
HOTPの登録QRは hotp をタイプとする otpauth:// スキームのURLです。共有HMACシークレットと双方が同期しなければならないカウンター値を持ちます。フォーマット:
otpauth://hotp/LABEL?secret=SECRET&issuer=ISSUER&counter=N&digits=N&algorithm=ALG- LABEL,
Issuer:Account、URLエンコード済み。例:YubiKey:alice@example.com。 - secret, 共有HMACキー、Base32エンコード(RFC 4648 §6: A-Z、2-7)。
- counter, 開始カウンター値。通常は
0。トークンを再登録する際に既知の値から再開できます。 - issuer, 認証アプリに表示されるサービス名。
- digits,
6(デフォルト)または8。RFC 4226 §5.3は6を規定。8は一般的な拡張。 - algorithm, 実際には
SHA1。RFC 4226はSHA1のみ定義。SHA256/512はRFC 6238で後から追加された拡張。
HOTPとTOTP, どちらを使うか
| 属性 | HOTP(RFC 4226) | TOTP(RFC 6238) |
|---|---|---|
| 進む基準 | カウンター(使用のたびに) | 時計(30秒ごと) |
| 時計同期が必要 | 不要 | 必要, 約30秒以内 |
| ずれた時の再同期 | サーバーが次のNカウンター値を受け入れる | サーバーが±1ウィンドウを受け入れる |
| 典型的な用途 | YubiKey、レガシーハードウェアトークン、オフライン銀行 | すべてのコンシューマー2FA, Google、Microsoft、1Password、Authy |
| カウンター再使用 | 壊滅的, 時間とともにシークレットを漏洩 | 該当なし |
| シークレット漏洩時の脆弱性 | 将来のすべてのコードが予測可能 | 過去と将来のすべてのコードが予測可能 |
標準テストベクター
RFC 4226 付録Dはシークレット 12345678901234567890(20バイト、Base32 GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ)に対する6桁のHOTP参照値を提供します:
| カウンター | HOTP(6桁) |
|---|---|
0 | 755224 |
1 | 287082 |
2 | 359152 |
3 | 969429 |
4 | 338314 |
5 | 254676 |
6 | 287922 |
7 | 162583 |
8 | 399871 |
9 | 520489 |
カウンター0での登録のための最小QRペイロード:
otpauth://hotp/Example:test?secret=GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ&issuer=Example&counter=0ライブBase32シークレットバリデーター
TOTPページと同じバリデーターです。HOTPシークレットも同じBase32アルファベット(RFC 4648 §6: A-Z、2-7)を使います。ブラウザで実行され、サーバーへの往復は不要です。
シークレットを入力して確認してください。
よくある落とし穴
- カウンターのずれ。 ユーザーがトークンボタンを押したがサーバーがコードを記録しなかった場合(ネットワーク障害、ダブルクリック)、トークンカウンターがサーバーカウンターより先に進みます。サーバーは「再同期ウィンドウ」で処理し、拒否前に次のNカウンター値を試みます。YubiKeyのデフォルトウィンドウは約3で、高セキュリティ環境では1に絞ります。
- カウンターの再使用は致命的です。 同じカウンター値を2度受け入れないでください。RFC 4226 §7.3はサーバーが最後に受け入れたカウンター以下のすべてのコードを拒否することを義務付けています。
- バックアップ時のカウンターエクスポート。 HOTPエントリをエクスポートする認証アプリはシークレットはエクスポートしても現在のカウンターをエクスポートしないことがあります。新しいデバイスにインポートするとカウンターが0から再起動し、サーバーと一致しなくなります。TOTPは影響を受けませんが、HOTPはここで脆弱です。
- Base32はBase64ではありません。 TOTPと同じルール:
0、1、8、9、小文字、+、/を含むシークレットはBase64であり、すべてのRFC準拠認証アプリに拒否されます。 - 実際にはSHA1のみ。 RFC 4226はSHA1をHMAC関数として定義しています。ほとんどのHOTPハードウェアトークンはSHA256/SHA512を実装していません。
- 桁数パラメーターはしばしば無視されます。 多くのハードウェアトークンは6桁に固定されており、8を求めると静かに切り詰めます。QRが印刷カードに届く前にターゲットハードウェアで確認してください。
- HOTPとTOTPを同じQRに混在させないでください。 URIスキームは
TYPEセグメント(hotpvstotp)でモードを切り替えます。1つのシークレットが両方のフローを駆動できますが、シークレットを共有するということは1つが侵害されれば両方が失敗することを意味します。
認証アプリの互換性
| アプリ / トークン | HOTP | SHA256/512 | 8桁 | 備考 |
|---|---|---|---|---|
| YubiKey Authenticator(iOS/Android/デスクトップ) | あり | あり | あり | HOTPはYubiKey OATHの標準モード。完全なRFC 4226サポート。 |
| Google Authenticator | あり | 無視(SHA1のみ) | 無視(6のみ) | デファクトベースライン。HOTPは安全ですが6桁のSHA1のみ。 |
| 1Password | あり | あり | あり | 完全なRFCサポート。カウンターはエントリと共に保存・エクスポートされます。 |
| Bitwarden | あり | あり | あり | 完全なRFCサポート。 |
| Microsoft Authenticator | あり | あり | あり | 完全なRFCサポート。 |
| Authy | なし | , | , | 最近のバージョンではHOTPを削除。TOTPのみ。 |
| Duo Mobile | なし | , | , | 独自のプッシュフローを使用。TOTPのみのフォールバック。 |
| OATHハードウェアトークン(Feitian、Token2など) | あり | さまざま | さまざま | 標準的なハードウェアHOTP市場。データシートに別の記載がなければ常に6桁のSHA1。 |
関連ページ
- /hotp-qr-code/, ライブカウンターとBase32検証があるHOTPジェネレーター。
- /standards/totp/, 時間ベース版(RFC 6238)。
- /totp-2fa-qr-code/, TOTPジェネレーター。
- /standards/, 規格インデックスに戻る。