概要
Google Authenticator、Microsoft Authenticator、1Password などの二要素認証アプリは、30 秒ごとに変わる 6 桁のコードを表示します。各コードは共有シークレットから計算されるワンタイムパスワードで、TOTP(RFC 6238)は時刻、HOTP(RFC 4226)はカウンターを使います。このツールはシークレットから同じコードを計算するので、2FA の設定テスト、サーバー実装のデバッグ、ある時点で正しいコードの確認に使えます。
現在のコードとリアルタイムのカウントダウンに加え、時計のわずかなずれに備えてサーバーがよく受け付ける前後のコードも表示します。
使い方
- Base32 シークレット(A〜Z と 2〜7。空白や大文字小文字は無視されます)か、QR コードの
otpauth://URI 全体を貼り付けます。サンプルで試せます。 - TOTP か HOTP を選び、アルゴリズム・桁数・時間間隔をアカウントに合わせます。otpauth URI 内の設定が優先されます。
- HOTP ではカウンターを入力し、カウンター +1 で次々にコードを確認できます。
- 現在のコードをコピーします。カウントダウンが有効な残り時間を示します。
例
デモ用シークレット 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 コードにしてユーザーに渡し、サーバーが計算したコードとここに表示されるコードを比べてください。サーバーは時計のずれに備えて、前後のコードも受け付けるのが一般的です。