DevToolPal
日本語

TOTP / HOTP コード生成ツール

Base32 シークレットまたは otpauth:// URI から二要素認証コード(TOTP・HOTP)を生成します。SHA-1/256/512、6〜8 桁、リアルタイムのカウントダウンに対応。

ローカルで処理、アップロードなし

オプション

種類
桁数
時間間隔

シークレット(Base32)または otpauth:// URI

コード

結果はここに表示されます

概要

Google Authenticator、Microsoft Authenticator、1Password などの二要素認証アプリは、30 秒ごとに変わる 6 桁のコードを表示します。各コードは共有シークレットから計算されるワンタイムパスワードで、TOTP(RFC 6238)は時刻、HOTP(RFC 4226)はカウンターを使います。このツールはシークレットから同じコードを計算するので、2FA の設定テスト、サーバー実装のデバッグ、ある時点で正しいコードの確認に使えます。

現在のコードとリアルタイムのカウントダウンに加え、時計のわずかなずれに備えてサーバーがよく受け付ける前後のコードも表示します。

使い方

  1. Base32 シークレット(A〜Z と 2〜7。空白や大文字小文字は無視されます)か、QR コードの otpauth:// URI 全体を貼り付けます。サンプルで試せます。
  2. TOTP か HOTP を選び、アルゴリズム・桁数・時間間隔をアカウントに合わせます。otpauth URI 内の設定が優先されます。
  3. HOTP ではカウンターを入力し、カウンター +1 で次々にコードを確認できます。
  4. 現在のコードをコピーします。カウントダウンが有効な残り時間を示します。

例

デモ用シークレット JBSWY3DPEHPK3PXP は、バイト列「Hello!」と 0xDEADBEEF を Base32 にしたものです。次の URI(QR コードに入っている内容)は、これを既定の設定で使うアカウントを表します。

otpauth://totp/Example:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Example&algorithm=SHA1&digits=6&period=30

Unix 時刻 1700000000 では、このシークレットのコードは 324 550 で、現在の時間枠は残り 10 秒です。

コードの計算方法

まず Base32 シークレットをバイト列にデコードします。TOTP のカウンターは、秒単位の Unix 時刻を時間間隔で割って切り捨てた値です。カウンターを 8 バイトで表し、シークレットで HMAC 署名します。動的切り詰めで HMAC 出力の最後の 4 ビットをもとに 4 バイトを選び、指定桁数で剰余を取り、先頭のゼロを残します。

よくある質問

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

TOTP は時計に依存するため、まず端末の時刻が自動設定になっているか確認してください。次に、アルゴリズム・桁数・時間間隔がアカウントと一致しているか確認します。ほとんどのサービスは SHA-1、6 桁、30 秒を使い、QR コードに指定がない限り認証アプリはほかの設定を無視します。

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

TOTP(RFC 6238)は現在時刻を時間間隔で割った値をカウンターとして使うため、コードは 30 秒ごとに変わります。HOTP(RFC 4226)はコードを使うたびに 1 ずつ増えるカウンターを使います。どちらもシークレットとカウンターを HMAC にかけ、最後の 6〜8 桁を取り出します。

› シークレットは保存・送信されますか?

いいえ。コードは Web Crypto API を使ってブラウザー内で計算されます。シークレットは保存されず、アドレスバーにも共有リンクにも含まれません。共有リンクには設定だけが入ります。ただし 2FA のシークレットは第二要素そのものなので、自分のものだけを貼り付けてください。

› 自分のアプリに二要素認証を導入するときに使えますか?

はい。「ランダムなシークレット」で 160 ビットの Base32 シークレットを作り、otpauth:// URI や QR コードにしてユーザーに渡し、サーバーが計算したコードとここに表示されるコードを比べてください。サーバーは時計のずれに備えて、前後のコードも受け付けるのが一般的です。