totonoe

ITを整える

中級

2段階認証(TOTP)を整える

= スマホの認証アプリが出す6桁の数字の正体

パスワードの「もう一押し」が2段階認証。SMS・認証アプリ・パスキーの違いを整理し、認証アプリが出す6桁コード(TOTP)が何者かを、実際にブラウザ内で再現します。秘密鍵を貼り付けると、お使いのアプリと同じ数字が30秒ごとに回ります。送信ゼロ。

i

TLDR — 30秒で分かる

認証アプリの6桁コードの正体を、秘密鍵を貼って実際にブラウザ内で再現。SMS・TOTP・パスキーの強さの違いも一目で。秘密鍵は送信されません

主な機能を見る
  • Base32 秘密鍵 / otpauth:// URI から TOTP を生成
  • アプリと同じ30秒ごとの6桁を実時間で更新+カウントダウン
  • ワンクリックでコードをコピー
  • SMS / 認証アプリ / パスキーの強さ比較表
  • 秘密鍵は送信ゼロ(Web Crypto・RFC6238準拠)
アニメで見る — 2段階認証(TOTP)のしくみ ▶ 再生で1ステップずつ動きます
📱

端末・アプリ

Authenticator

🔑 秘密鍵
🕐 いまの時刻
🔢 123 456
🖥️

サービス

サーバ

🔑 同じ秘密鍵
🕐 同じ時刻
🔢 123 456
📱

あなた

ログイン画面

🔢 123 456
🖥️

サービス

サーバ

🔢 正解 123 456
✅ 一致=本人

STEP 1

※ イメージ図です。下の「ライブ生成」と「仮想ログイン」で、実際に動かして確かめられます。

秘密鍵(Base32)

認証アプリの「設定キー」を貼り付けます。空白・ハイフン・大小は気にしなくて大丈夫。 この鍵はブラウザの外に出ません。

QRコード(otpauth://)から取り込む — 上級・任意

otpauth:// は、2段階認証を登録するときに表示される QRコードの中身(秘密鍵や発行元が入った文字列)です。 スマホでQRを読めないときに、PCでこの文字列から秘密鍵を取り込むために使います。 分からなければ空欄でOK — 上の「秘密鍵」だけで動きます。

いまの6桁コード

この6桁は「秘密鍵」と「いまの時刻(30秒のコマ)」だけから計算されます。 だからサーバと通信せずに、あなたのスマホのアプリと同じ数字が出ます。30秒ごとに変わるのは、時刻のコマが進むから。

体験:ログインしてみる(仮想)

その6桁で、本当にログインできる?

「サーバ役」になりきって、ログイン時の答え合わせを再現します。上で出ている6桁を入れれば成功、 違う数字や時間切れのコードなら失敗。本物のログインで起きていることが、そのまま見えます。 この照合もすべてブラウザ内。どこにも送信されません。

demo-login.example

コードを入れて
「ログイン」を押すと
ここに結果が出ます

2つ目の鍵、3つの選び方。

2FA は「パスワード(知っている)+ もう1要素」。その「もう1要素」に何を使うかで強さが変わります。

方式 強さ 仕組み 弱点・注意
SMS
ショートメール
ログイン時に届く数字を入力 SIM スワップ(番号乗っ取り)や、画面の盗み見・偽サイトでの中継に弱い。それでも「なし」よりはずっと安全。
認証アプリ
TOTP・本ツールで実演
秘密鍵+時刻から30秒ごとの6桁を端末内で生成(通信不要) 標準(RFC 6238)。通信を介さず SMS より安全。ただし偽サイトに自分でコードを入力してしまうと中継される。機種変時は移行を忘れずに。
パスキー
FIDO2 / WebAuthn
公開鍵暗号+生体認証。サイトのドメインに紐づくため偽サイトでは動かない フィッシング耐性が高いのが最大の利点。入力する数字がないので盗み見・中継も困難。対応サービスはまずこれを選ぶのがおすすめ。

この6桁の作りかた(TOTP)

通信なしで「同じ数字」が出る、その仕組み。

  1. 1

    秘密鍵を、サーバとスマホで共有しておく

    登録時の QR コード(や設定キー)が、その共有の秘密鍵。これ以降は通信せず、両者が「同じ鍵」を持っている状態になります。

  2. 2

    いまの時刻を「30秒のコマ」に切る

    現在の Unix 時刻 ÷ 30 の整数部が「何コマ目か」。世界中で時計が合っていれば、サーバもスマホも同じコマ番号になります。

  3. 3

    鍵 × コマ番号 を「ハッシュ」にかける

    HMAC-SHA1(鍵, コマ番号) で 20 バイトの値を計算。鍵が同じ・コマ番号が同じなら、必ず同じ結果になります。

  4. 4

    そこから6桁を切り出す

    決められたルール(動的トランケーション)で 4 バイトを取り出し、÷ 1,000,000 の余りで6桁に。これが画面の数字です。次のコマに進めば、別の6桁に変わります。

⚠ 大事なポイント

ログイン側は、サーバが自分でも同じ計算をして照合するだけ。コード自体を送って答え合わせするので、秘密鍵がネットを流れることはありません。だからこのページも、秘密鍵をサーバに送らず同じ数字を出せます。

💡 規格は RFC 6238(TOTP)/ RFC 4226(HOTP)。本ツールは Web Crypto API でブラウザ内計算しており、既知のテストベクタ(秘密鍵 = "12345678901234567890" の Base32、時刻 59 秒 → 287082)と一致することを確認済みです。秘密鍵・コードは保存も送信もされません。

よくある質問

Q. 入力した秘密鍵はどこかに送られますか?
A. いいえ。秘密鍵もコードもサーバには送信されず、すべてお使いのブラウザ内(Web Crypto API)で計算されます。保存もしません。ページを閉じれば何も残りません。
Q. なぜ通信していないのに、アプリと同じ数字が出るのですか?
A. TOTP は「共有された秘密鍵」と「いまの時刻(30秒のコマ)」だけから計算するためです。両者が同じ鍵を持ち時計が合っていれば、通信せずに必ず同じ6桁になります。
Q. コードが30秒ごとに変わるのはなぜですか?
A. 時刻を30秒ごとのコマに区切り、そのコマ番号を計算に使うからです。コマが進むたびに別の6桁になります。残り時間はリングで確認できます。
Q. 自分のスマホアプリと数字がずれます。
A. 多くは端末の時計のずれが原因です。スマホやPCの時刻を自動設定(NTP同期)にしてください。秘密鍵の打ち間違い(O と 0、I と 1 など)でもずれます。
Q. SMS・認証アプリ・パスキーのどれを選べばいいですか?
A. 対応していれば最も安全なパスキーが第一候補です。なければ認証アプリ(本ツールの TOTP)、それも無理なら SMS。SMS でも「2段階なし」よりはずっと安全です。
Q. 認証アプリ(TOTP)は完全に安全ですか?
A. SMS より安全ですが万能ではありません。偽サイトに自分でコードを入力してしまうと中継される恐れがあります。フィッシングまで防ぎたい場合はパスキーが有効です。
Q. otpauth:// の URI とは何ですか?
A. 認証アプリの登録 QR コードに埋め込まれている文字列で、秘密鍵や発行元が含まれます。スマホで QR を読めないときに、PC でこの文字列から秘密鍵を取り込むために使います。分からなければ空欄で問題ありません(上の「秘密鍵」だけで動きます)。
Q. 「仮想ログイン」で少し前のコードでも成功するのはなぜ?
A. 実際のログインサーバは、端末とサーバの時計が数秒ずれていてもログインできるよう、前後1コマ(約±30秒)までを「正しい」と認めるのが一般的です。本ツールの仮想ログインもこれを再現しているため、直前のコードでも成功することがあります(その場合は「1コマ分のズレを許容して一致」と表示します)。さらに古いコードは「時間切れ」になります。

入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。

RELATED TOOLS

続けて整える

KOINOBORI ECOSYSTEM

私たちが運営するサイト