2段階認証コード生成ツール(TOTP)
Base32 のシークレットキーや otpauth:// URI から 2段階認証コード(RFC 6238 の TOTP)を生成。RFC のテストベクトルで検証済み。キーは保存せず URL にも入れません。
- ブラウザ内で処理
- データはブラウザ外に出ません
- 無料 · 登録不要
WeChat でスキャンしてシェア
例・詳しい説明・よくある質問 実際の出力つきの例、ほかのツールとの違い、よくある質問。
計算は RFC 6238(TOTP)のとおりで、T = floor(Unix 時刻 / 周期) に RFC 4226 の HOTP を適用します。
QR コードを読めずにキーを手入力したとき
GMO コインのサポート記事「2段階認証方法の変更<SMS→アプリ>」では、QR コードをスキャンできない場合は「QRコードをスキャンできない場合」を選んでキーを表示し、アプリの[提供されたキーを入力]から入力する手順になっています。同じ記事にあるとおり、アプリの名前は iPhone では「Google Authenticator」、Android では「Google認証システム」です。
手入力で 1 文字でも違うと、アプリは 6 桁の数字を出し続けますが、サーバーは一度も受け付けません。画面のキーをこのツールにも貼り、同じ 30 秒の間にアプリと数字を比べてください。
- 数字が違う:アプリ側のキーが間違っています。キーに
0・1・8・9が入っていればこのツールがその文字を示します。Base32 はこの 4 つの数字を使わないので、O・I・B の読み違いが疑われます。 - 数字は同じなのに拒否される:時計を確認します。RFC 6238 の 5.2 節は、検証側が通信遅延として認める幅を最大 1 ステップにするよう推奨しています。端末の時計とサーバーの時刻が約 3 秒以上ずれていると、このツールが警告を出します。
全角で入力されたキー(GEZD GNBV …)も半角に直して扱うので、メモ帳などからそのまま貼って構いません。
実例:RFC のテストベクトルで確かめる
RFC が公開しているテスト用キーなので、ほかの実装でも同じ結果になるはずです。
| キー(Base32) | 設定 | Unix 時刻 | 前 | 現在 | 次 |
|---|---|---|---|---|---|
GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ | SHA-1・8 桁 | 1111111109 | 89731029 | 07081804 | 14050471 |
| 同上 | SHA-1・6 桁 | 1111111109 | 731029 | 081804 | 050471 |
32 バイトの種(末尾 ====) | SHA-256・8 桁 | 20000000000 | 98955129 | 77737706 | 59879174 |
1 行目の 07081804 と「次」の 14050471 は、RFC 6238 付録 B の 1111111109 秒と 1111111111 秒の SHA-1 の値です(2 つの時刻は隣り合うステップに入ります)。先頭の 0 も残します。3 行目の 20000000000 秒は 2603 年で、T は 666666666 です。32 バイトの種は GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZA==== で、RFC の本文は 20 バイトの種しか挙げていませんが、付録 A の参照コードは SHA-256・SHA-512 に 32・64 バイトの種を使っており、表の値もそれに対応しています。
発行者に「社内ポータル」、アカウントに yamada を入れると、URI は otpauth://totp/%E7%A4%BE%E5%86%85%E3%83%9D%E3%83%BC%E3%82%BF%E3%83%AB:yamada?secret=GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ&issuer=%E7%A4%BE%E5%86%85… になります。日本語は UTF-8 でパーセントエンコードし、Google の Key Uri Format に従って既定値(SHA1・6 桁・30 秒)は省きます。発行者やアカウントに半角の「:」があると区切り文字と区別できないため、エラーにします。
他の 2FA コード生成サイトとの違い
2026-09-30 に、「2段階認証 コード 生成」の検索結果に出るツールを同じ入力で試しました。
- キーの送り先。 2fa.f5.si(「X (Twitter)用ツール」)は、ボタンを押すと
https://api.choko.cc/otp?code=<キー>にリクエストを送り、別ドメインのサーバーがコードを返します。BrowserScan はキーをアドレスバーの#以降に書き込むため、閲覧履歴に残ります。このツールのキーはページのメモリにだけあり、送るのはキーを含まない時刻確認の HEAD だけです。 - 不正な文字。
GEZDGNBV1Y3TQOJQ(1を含む)に対し、BrowserScan はコードを表示しました(赤字の「キー文字が不正です。キーを確認してください」は正しい RFC のキーでも出ていました)。2fa.f5.si は「2FAコードの取得に失敗しました。」とだけ表示します。このツールはどの文字が原因かを示します。 - otpauth:// の貼り付け。 BrowserScan は URI を貼るとコードを出しませんでした。このツールは URI の設定をすべて読み込みます。
- 設定。 SHA-1・SHA-256・SHA-512、6 桁・8 桁、1〜86400 秒の任意の周期、固定の Unix 時刻を選べます。
制限事項
- TOTP 専用です。
otpauth://hotp/は受け付けず、カウンターモードはありません。 - 桁数は Key Uri Format の値である 6 と 8 のみ。周期は 1〜86400 の整数秒で、起点は Unix エポック(T0 = 0)です。
- Key Uri Format の文書によると、Google Authenticator は
algorithmとperiodを無視し、Android 版はdigitsも無視します。これらを変えると QR コードの下に注意書きが出ます。 - QR コードの画像は読めません。QRコード読み取りで
otpauth://の文字列を取り出してから貼ってください。ほかの文字列を QR コードにするには QRコード作成を使います。 - 何も保存しません。再読み込みでキーは消えます(意図した動作です)。
- 時計チェックはサーバーの
Dateヘッダー(1 秒単位)を使うため、約 3 秒以内のずれは表示しません。リクエストに失敗したときも何も表示しません。
HMAC の計算だけを確かめたいときは HMAC ジェネレーター、アカウントのパスワードにはパスワードジェネレーターが使えます。
FAQ
シークレットキーは送信・保存されますか?
されません。コードはブラウザの Web Crypto API で端末内で計算します。キーは localStorage・sessionStorage・Cookie・URL のどこにも書き込まず、このページはアクセス解析と広告のスクリプトも読み込みません。再読み込みするとキーは消えます。ツールが送るリクエストは、時計チェックのためにサーバーの Date ヘッダーを読む、このページへの HEAD リクエスト 1 回だけで、クエリ文字列も本文も付けません。
アプリやサーバーとコードが一致しないときは?
端末の時計(約 3 秒以上ずれていると表示します)、キー(1 文字の読み違い、設定画面を開き直したことによるキーの変更)、設定(アルゴリズム・桁数・周期は両側で同じにする必要があります)の順に確認してください。現在のコードの下にある前後のコードを見ると、相手側が 1 ステップずれているかどうかが分かります。
QR コードの otpauth:// リンクをそのまま貼れますか?
貼れます。otpauth://totp/ の URI をまるごとシークレット欄に貼ると、キー・発行者・アカウント・アルゴリズム・桁数・周期を読み込み、入力欄にはキーだけを残します。otpauth://hotp/(カウンター方式)は時刻ベースではないため受け付けません。QR コードの画像から URI を取り出すには、先に QR コードデコーダーを使ってください。
ランダム生成のキーの長さは?
SHA-1 は 20 バイト(160 ビット)、SHA-256 は 32 バイト、SHA-512 は 64 バイトです。RFC 6238 の 5.1 節が推奨する、HMAC の出力と同じ長さです。RFC 4226 は 128 ビット以上を必須としており、それより短いキーでも計算はできますが警告を表示します。
普段使いの認証アプリの代わりにできますか?
おすすめしません。何も保存しないのでタブを閉じればコードは消え、キーを持つ人なら誰でも同じコードを作れます。本番アカウントのキーは認証アプリかパスワードマネージャーに保管してください。このページは 2段階認証の実装テスト、手入力したキーの確認、特定の時刻のコードの確認に向いています。