テスト用の Base32 シークレットで、認証アプリの設定と生成されるコードを比べられます。TOTP は時計に基づくコード、HOTP は指定したカウンターに基づくコードです。
ブラウザ内でローカルに実行使い捨てのテスト用シークレットを使って、生成された値を自分の実装と比較します。クロックドリフト、シークレットの保管、リカバリーコード、レート制限、アカウント復旧には、引き続きサーバー側の制御が必要です。
このワークベンチは、Base32 シークレットから認証アプリが表示するワンタイムコードを、選んだアルゴリズム・桁数・期間またはカウンターで計算します。QR コードが持つ otpauth:// プロビジョニング URI も生成します。
HMAC はタブ内で Web Crypto により計算されます。計算中にツール自身がリクエストを送ることはないため、シークレットと生成したコードはブラウザ内に留まります。
コードは使用中のカウンターに対する 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 は otpauth:// のキー形式(secret、issuer、algorithm(SHA1 / SHA256 / SHA512)、digits、period または counter)に従います。これは QR コードが符号化する文字列です。シークレットは空白とパディングを除いた Base32 で書き直され、ラベルは発行者とアカウント名をつなげたものになります。
HMAC と URI はタブ内で生成され、ツール自身はリクエストを送らないため、シークレットと生成したコードがブラウザの外に出ることはありません。実装との比較には使い捨てのテスト用シークレットを使い、本番のシードは保存を許可されたシステムで管理してください。