TOTP & HOTP
TOTP(時間ベースのワンタイムパスワード、RFC 6238)とHOTP(HMACベースのワンタイムパスワード、RFC 4226)は、2FAの登録QRが実装する2つの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, 認証アプリに表示されるサービス名。ラベルを解析しないアプリのUXを改善するためにラベルと冗長になります。
- 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はこれを自動的に処理します。 - シークレットを再利用しないでください。 すべてのアカウントに新しい暗号論的にランダムなシークレットが必要です。サービス間でシークレットを再利用すると、1つの漏洩ですべてのサービスが危険にさらされます。
- ストレージは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/, 規格インデックスに戻る。