TOTP / HOTP ジェネレーター

テスト用の Base32 シークレットで、認証アプリの設定と生成されるコードを比べられます。TOTP は時計に基づくコード、HOTP は指定したカウンターに基づくコードです。

ブラウザ内でローカルに実行
シークレットとワンタイムコードはこのブラウザ内に留まります。可能な限りテスト用のシークレットを使用し、実際の認証シードは決して共有しないでください。
認証アプリの設定RFC 4226 / RFC 6238 パラメータ
パラメータレビュー
  • パラメータを選び、コードを計算して認証器の設定を確認します。

2FA を有効にする前にプロビジョニングをテストします。

使い捨てのテスト用シークレットを使って、生成された値を自分の実装と比較します。クロックドリフト、シークレットの保管、リカバリーコード、レート制限、アカウント復旧には、引き続きサーバー側の制御が必要です。

TOTP / HOTP コードを生成する手順

このワークベンチは、Base32 シークレットから認証アプリが表示するワンタイムコードを、選んだアルゴリズム・桁数・期間またはカウンターで計算します。QR コードが持つ otpauth:// プロビジョニング URI も生成します。

HMAC はタブ内で Web Crypto により計算されます。計算中にツール自身がリクエストを送ることはないため、シークレットと生成したコードはブラウザ内に留まります。

  1. Base32 シークレットを貼り付けるか、「テスト用シークレットを生成」で 160 ビットのランダムなシークレットを作ります。小文字・空白・= のパディングは無視されるので、サーバー設定からコピーしたシークレットをそのまま使えます。
  2. モードを選びます。TOTP は時間ステップを数える方式で、期間を選択します(30 秒が既定で最も互換性が高い値です)。HOTP はイベントを数える方式で、検証サーバーが持つカウンター値を入力します。
  3. ハッシュと桁数を、サーバーが検証する設定に合わせ(SHA-1・6 桁が一般的な既定です)、「コードを計算」を押します。「RFC サンプルを読み込む」で RFC 4226 のテスト用シークレットとカウンター 0 が入ります。
  4. 「パラメータレビュー」を確認します。デコード後のシークレット長、使用中のカウンター、桁数が表示され、シークレットが 20 バイト未満の場合、期間が 30 秒以外の場合、HOTP のカウンター運用についての注意が並びます。
  5. コードをコピーして照合するか、otpauth:// URI をコピーしてアプリを設定します。TOTP モードではタイムステップごとにコードが自動で再計算され、「クリア」ですべての項目が既定値に戻ります。

コードの正体と、どこに限界があるか

1 つのフォームで扱う RFC 4226 と RFC 6238

コードは使用中のカウンターに対する HMAC です。カウンターをシークレットで署名し、署名の最終バイトで 4 バイトの範囲を選び(動的トランケーション)、その値を 10^桁数 で割った余りを求めます。TOTP は同じ関数で、カウンターを Unix 時間を期間で割った値から作ります。そのため TOTP のコードは自動で切り替わり、HOTP のコードは次のカウンターを待ちます。

このツールは公開されているテストベクターと一致します。RFC のシークレットでは、HOTP のカウンター 0〜5 が 755224、287082、359152、969429、338314、254676 を返します。T=59 を含む RFC のタイムステップ内の時計では SHA-1・8 桁で 94287082 を返し、後続のベクター(T=1111111109 と T=20000000000)では 07081804 と 65353130 を返します。

パラメータレビューが示すこと、示さないこと

レビューは使用したパラメータを繰り返し、サーバー側の 2 つの責務を思い出させます。HOTP のカウンターは検証側でアトミックに増分して保存する必要があり、デコード後 20 バイト未満のシークレットは本番には短すぎます。30 秒以外の期間や SHA-256 / SHA-512 も有効ですが、対応するアプリとサーバーは限られます。

ここでは入力されたコードの検証、サーバーのクロックドリフトの測定、シークレットが自分のアカウントのものかどうかの確認は行いません。生成したコードは、それを検証する実装と突き合わせて確認し、最終的な基準は認証アプリの登録フローに置いてください。

ローカル処理とプロビジョニング URI

URI は otpauth:// のキー形式(secret、issuer、algorithm(SHA1 / SHA256 / SHA512)、digits、period または counter)に従います。これは QR コードが符号化する文字列です。シークレットは空白とパディングを除いた Base32 で書き直され、ラベルは発行者とアカウント名をつなげたものになります。

HMAC と URI はタブ内で生成され、ツール自身はリクエストを送らないため、シークレットと生成したコードがブラウザの外に出ることはありません。実装との比較には使い捨てのテスト用シークレットを使い、本番のシードは保存を許可されたシステムで管理してください。

最近使ったツール: