ByteScope

TOTP Generator

base32のsecretかotpauth:// URIを貼れば、30秒周期のカウントダウンリングと一緒に6桁コードが回り続けます — 計算はすべてあなたのブラウザ内で。

ファイルはブラウザから送信されません — 処理はすべてローカルで行われます。

読み込み中…

このツールについて

TOTPに魔法はありません。共有secretと現在時刻からHMACを計算し、6桁に切り詰める — RFC 4226のHOTPの上にRFC 6238が定めた、それだけの仕組みです。登録したサーバー側とコードを生成する側が同じbase32 secretを持ち、同じ30秒刻みの時間ステップに同じ計算をするから、ネットワークなしでもコードが一致する。裏を返せば、時計が狂っていることがコードが合わない理由の第1位になります。このページが実装しているのはその計算だけで、RFC付録の公式テストベクタで検証済みです。

何を貼ろうとしているのか、はっきりさせておきます。TOTPのsecretはパスワードとは違います。漏れたら替えればいいものではなく、今後生成されるすべてのコードの種そのものなので、手に入れた人はこの先ずっと有効なコードを作れます。アップロードするサイトに貼ることは、2つ目の鍵を丸ごと渡すことと同じです。このページは裏にサーバーを持たない静的ファイルで、コードはタブ内のJavaScriptが計算し、secretはどのネットワークリクエストにも現れません — devtoolsで自分で確認できます。ここまでが安心できる半分。もう半分も言います。secretをブラウザのlocalStorageに置くのは、ロックされたスマートフォン上の専用アプリより弱い保管方法です。暗号化していないエントリは、このブラウザプロファイルに触れるものなら何でも読めます — 権限の広い拡張機能、マシン上のマルウェア、ロックし忘れた席の前に立った誰か。パスフレーズ暗号化のオプションはまさにこのリスクのためにあり、だから使う価値があります。

パスフレーズを設定すると、エントリはlocalStorageに書かれる前にAES-GCMで暗号化されます。鍵はパスフレーズからPBKDF2で導出し、使うのはブラウザ組み込みのWebCryptoで、第三者の暗号ライブラリは挟みません。ディスクに残るのは暗号文で、パスフレーズなしにはただのbyte列、パスフレーズ自体はどこにも保存されません。その裏返しがこの設計の核心です。パスフレーズを忘れたら、エントリは戻りません。復旧もリセットメールも裏口もない — あなたのための裏口は他人のための裏口でもあるからで、これは仕様であってバグではありません。失っても実害は小さく、バックアップコードでサービスにサインインして2FAを登録し直せば、新しいsecretが発行されます。

アカウントの追加は3通り。base32のsecretを貼る、otpauth:// URIをまるごと貼る、登録用QRコードをスキャンする — QRはあのURIを画像にしただけのもので、デコードも他と同じくローカルで行います。複数アカウントを並べて表示し、それぞれにコード、クリックコピー、そして30秒ステップのどこにいるかを示すカウントダウンリングが付きます。ひとつ持っておきたい習慣:リングが残りわずかなら、期限と競走せずに1〜2秒待って次のコードを使うこと。多くのサーバーは前後1ステップを許容しますが、切り替わる瞬間に打ち込んだコードは、この競走に負ける典型パターンです。桁数とアルゴリズムは設定可能 — 6桁か8桁、SHA-1・SHA-256・SHA-512 — で、デフォルトから外れる少数派のサービスに備えています。

よくある質問

secretはどこかへアップロードされますか?

されません。そしてこれは信じるのではなく、確かめてください。devtoolsを開いてNetworkタブに切り替え、アカウントを追加してみる — secretを運ぶリクエストはひとつもなく、ページの読み込み後ならネットワークを切ってもコードは生成できます。このページは裏にAPIを持たない静的ファイルなので、送り先が原理的に存在しません。他のどのツールよりここでこれが重要なのは、TOTPのsecretは一度漏れたら永久に危殆化するからです。パスワードのように替えることはできず、アカウントの2FAを登録し直すしかありません。

コードが間違っている・サーバーに拒否されるのはなぜですか?

ほぼ時計です。TOTPはUnix時間を30秒刻みに区切り、両側が同じ区画に乗って初めて一致します。デバイスの時計が1分ずれていれば、生成されるコードは一貫して『有効』 — ただし間違った時刻に対して、です。多くのサーバーはRFC 6238の推奨どおり前後1ステップ(約±30秒のずれ)を許容するので、30秒以内のドリフトはたいてい気づかれず、それを超えると弾かれ始めます。直すべきはシステム時計で、ネットワーク時刻同期を有効にしてください。残りの原因も一応:secretの書き写しミス(base32のアルファベットに 0189 はありません)、あるいはサービス側が8桁やSHA-256を使っているのにエントリがデフォルトのまま、というケースです。

アルゴリズムと桁数の設定は何のため?SHA-1は大丈夫ですか?

RFC 6238が定めるTOTPのデフォルトはHMAC-SHA-1・6桁・30秒で、実際ほぼすべてのサービスがこの組み合わせです。SHA-1の既知の弱点は衝突攻撃で、これはHMAC-SHA-1への攻撃にはつながりません。secretなしでコードを計算するにはHMAC自体を破る必要があり、それは誰も成し遂げていません。つまりここでのSHA-1は、証明書署名でのSHA-1のような弱点ではありません。設定が存在するのは、SHA-256やSHA-512、8桁コードを使う少数派のサービスのためです。サービス側が明示している場合(otpauth:// URIに algorithm=digits= が付いている場合)はエントリも合わせてください。アルゴリズムの不一致は、ときどき間違うのではなく毎回間違います。

認証アプリの代わりになりますか?

なりません。目指してもいません。これは手元の便利ツール兼デバッグツールです。デスクでコードを確認する、配備前のsecretがサーバーの期待どおりのコードを生むか検証する、otpauth:// URIの中身を調べる — そういう用途に向いています。スマートフォンの専用認証アプリは、secretをハードウェア裏付けのストレージに置き、端末のロックで守り、ブラウザデータの消去でも消えず、ブラウザ拡張機能からも見えません。localStorageのsecretは、暗号化してもその保護は得られません。主力の2FAはきちんとバックアップした本物の認証アプリに置き、このページはブラウザツールの得意なことに使ってください。

パスフレーズを忘れました。エントリは復旧できますか?

できません。これは見落としではなく設計です。エントリはAES-GCMの暗号文で、鍵はパスフレーズからPBKDF2で導出されるため、パスフレーズがなければこのマシン上に復号できるものは存在しません — 復旧手続きもリセットもなしです。復旧手段があるなら、それは他人にも使える経路になります。実際の対処は速いです。まだ使える認証アプリかバックアップコードで各サービスにサインインし、2FAを登録し直せば新しいsecretが発行されます。バックアップコードの存在意義もここにあります — このブラウザではない場所に保管してください。

スキャンしたQRコードはどこかへ送信されますか?

されません。登録用QRコードの正体は、otpauth:// URIをピクセルに描いただけのものです — アカウント名、発行者、base32 secretをひとつのURLに詰めたもの。カメラのフレームはタブ内のJavaScriptがデコードし、URIの解析も同じ場所で行われ、画像も中身もネットワークリクエストには現れません — 先ほどのdevtoolsでの確認がここでも使えます。ただしQR自体はsecretと同じ重さで扱ってください。登録QRのスクリーンショットはsecretそのものであり、そのアカウントが登録をやり直さない限り有効なままです。