> totp | authenticator | generator <

Base32シークレットから時間ベース(TOTP)とカウンターベース(HOTP)のワンタイムパスワードを生成します。2FA設定のテスト、認証アプリとのコードのずれの調査、otpauth:// URIの作成をすべてブラウザ内で行えます。

------

------

シークレットがブラウザの外に出ることはありません。ただし、共有パソコンに本番用の実シークレットを貼り付けるのは避けてください。

OTPAUTH URI

認証アプリ用のQRコードが必要ですか? URIを次のツールに貼り付けてください: QRコードジェネレーター

[01]

カウントダウン付きライブコード

Base32シークレットを貼り付けると、現在のコードと次のコードを表示し、期間ごとに更新。期限までの進行バーも表示します。

[02]

SHA-1・SHA-256・SHA-512

6・7・8桁と任意の期間に対応。HMACはWeb Crypto APIで計算し、RFC 4226とRFC 6238のテストベクターと一致します。

[03]

otpauth URIの作成とインポート

認証アプリ向けのotpauth:// URIを作成したり、既存のURIをインポートして全項目を自動入力できます。データは送信されません。

>> 技術情報

ワンタイムパスワードの仕組み:

HOTP(RFC 4226)はHMAC(シークレット, カウンター)を計算し、結果を6〜8桁に切り詰めます。TOTP(RFC 6238)はカウンターをUnix時間÷期間(通常30秒)としたHOTPで、期間ごとにコードが変わり、通信しなくても双方が同じコードになります。共有シークレットは、Base32テキスト、またはotpauth:// URIを含むQRコードとして受け渡されるのが一般的です。

例:

RFC 6238 test vector (SHA-1) secret = GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ time = 59 -> counter = 59 / 30 = 1 code (8 digits) = 94287082

このTOTPジェネレーターを使う理由:

  • >ログイン機能の開発中に二要素認証をテスト・デバッグできる
  • >認証アプリとサーバーでコードが食い違う原因を調べられる
  • >正しい発行者・アルゴリズム・桁数・期間のotpauth:// URIを作成できる
  • >Unix時間の入力欄で固定時刻のコードを確認できる

>> よくある質問

Q: TOTPはどのように動作しますか?

A: アプリとサーバーが同じシークレットを共有します。双方がシークレットと現在のタイムステップ(Unix時間÷期間、既定は30秒)からHMACを計算し、6桁のコードに切り詰めます。2つの時計が合っていれば同じコードになります。

Q: ここにシークレットを入力しても安全ですか?

A: 計算はWeb Crypto APIを使ってすべてブラウザ内で行われ、サーバーには何も送信されません。ただしTOTPシークレットはアカウントへの鍵です。共有パソコンや信頼できない環境に本番の実シークレットを貼り付けず、デバッグにはテスト用アカウントを使ってください。

Q: 認証アプリとコードが一致しないのはなぜですか?

A: よくある原因は、時計のずれ(TOTPは数秒以内の正確な時刻が必要)、アルゴリズム・桁数・期間の違い、シークレットの入力ミスです。ほとんどのサービスが使うSHA-1・6桁・30秒が選択されているか確認してください。

Q: TOTPとHOTPの違いは何ですか?

A: HOTPはコードを使用したときだけ進むカウンターを使うため、使われるまでコードが有効です。TOTPは時計からカウンターを導き出すので、期間ごとに自動で失効します。一般向けの2FAではTOTPが圧倒的に普及しています。

Q: otpauth:// URIとは何ですか?

A: 2FAを有効にするときにスキャンするQRコードの中身で、otpauth://totp/Example:user@example.com?secret=...&issuer=Example のような形式です。シークレット、発行者、アカウントのほか、任意でアルゴリズム・桁数・期間を含みます。インポート欄に貼り付けるとシークレットを取り出せます。

Q: 認証アプリはどの設定に対応していますか?

A: Google Authenticatorなど多くのアプリはアルゴリズム・桁数・期間のパラメーターを無視し、常にSHA-1・6桁・30秒を使います。アプリとサーバーが別の設定に対応していると分かっている場合を除き、この既定値を使ってください。

他の言語