2FA のコードの仕組み:TOTP をわかりやすく解説
執筆:Novaz チーム · 更新日:2026年10月29日
Novaz の手順はバージョン 1.0.5 で確認済み
このページは英語のガイドを翻訳したものです。サービスのウェブサイト上のボタンやメニューは、日本語では名称が多少異なる場合があります。
このページの内容
認証アプリとサイトは、双方が持っている2つのもの、つまり一度だけ共有した シークレットキー と 現在時刻 から、それぞれ同じ6桁の数字を計算します。サインインのときに両者の間で何かが送られることはありません。だからこそ、電波がなくてもコードが使え、30秒ごとにコードが変わるのです。この方式は TOTP(時間ベースのワンタイムパスワード)と呼ばれ、オープンな標準規格です(RFC 6238)。
材料1:設定キー
2FA をオンにすると、サイトはランダムなシークレットを作成し、QR コードとして表示します。テキスト版は設定キーと呼ばれます。アプリはこれを保存します。それ以降、サイトとアプリは同じキーを持ち、ほかの誰も持っていない状態になります。
QR コードの中身は、otpauth://totp/… という標準形式のリンクにすぎません。キー、サービス名、アカウント名、そして任意で後述の設定が含まれています。中身は2FA QR コードデコーダーで確認できます。
材料2:一定間隔で数える時刻
双方とも、現在時刻を1970年1月1日からの秒数(Unix 時間)として取得し、30で割って余りを切り捨てます。結果は30秒ごとに1ずつ増える整数になります。RFC 6238 はこれを T と呼び、「a default time-step size of 30 seconds」(既定のタイムステップは30秒)を推奨しています。
2つを混ぜてコードにする
アプリはキーと T を、暗号学的な関数である HMAC にかけます。通常は SHA-1 を使います。そのあと、HOTP の標準規格(RFC 4226、セクション 5.3)で定められた方法で、結果を短い数字に切り詰めます。
- HMAC の結果の最後の4ビットで、結果の中の位置を決めます。
- その位置から31ビットを取り出し、数値として扱います。
- その数値の下6桁を残します。8桁を使うサービスもあります。
キーかタイムステップが変われば、まったく違うコードになります。コードからキーを逆算することはできません。
Try it: a live TOTP code
Calculated in your browser from an example key. Don't paste a real setup key here.
Current code
…
Previous: …
Next: …
- Unix time
- …
- Time step T = ⌊time ÷ 30⌋
- …
- Seconds left
- …
サイトがコードを受け付ける理由
サイトは、自分が持っているキーのコピーと自分の時計で同じ計算をします。数字が一致すれば、サインインできます。実際の運用では、次の2つの点が重要です。
- 遅延のための少しのゆとり。 タイムステップの終わりに入力したコードが、次のステップになってから届くことがあります。RFC 6238 は「at most one time step is allowed as the network delay」(ネットワーク遅延として許容するのは最大1タイムステップ)を推奨しているので、多くのサイトは現在の1つ前のコードも受け付けます。
- 各コードは1回しか使えません。 標準規格では、すでに受け付けたコードについて、サーバーは「MUST NOT accept the second attempt」(2回目の試行を受け付けてはならない)と定めています。米国の NIST のガイドラインも同様に、検証者は「SHALL accept a given OTP only once while it is valid」(有効な間、特定の OTP を1回だけ受け付ける)としています(NIST SP 800-63B-4)。
時計がずれているとコードが使えなくなるのも、これが理由です。iPhone の時計が1分ずれていると、サイトとは別のタイムステップのコードを計算していることになります。認証アプリのコードが使えない?をご覧ください。
サービスが変更できる設定
標準規格はある程度の違いを認めており、QR コードでその設定を伝えられます。
| 設定 | 通常の値 | ほかに使える値 |
|---|---|---|
| ハッシュ | SHA-1 | SHA-256、SHA-512(RFC 6238、セクション 1.2) |
| 桁数 | 6 | 7 または 8(RFC 4226、セクション 5.3) |
| 間隔 | 30秒 | その他の長さ |
サービスが一般的でない設定を使っている場合は、キーを入力するのではなく QR コードをスキャンして追加してください。そうすれば、アプリに設定も伝わります。
TOTP と HOTP
古い標準規格である HOTP は、時刻の代わりに、コードを要求するたびに増えるカウンターを使います。TOTP は、タイムステップをカウンターとして使う HOTP です。つまり「TOTP = HOTP(K, T)」です。現在、ほとんどのサイトは TOTP を使っています。
TOTP が防げないこと
コードは自分で入力するので、本物そっくりの偽のサインインページがコードを求めて、すぐに使うことができます。NIST ははっきりと「OTP authentication is not phishing-resistant」(OTP 認証はフィッシング耐性がない)と述べています。パスキーとセキュリティキーにはフィッシング耐性があります。詳しくは認証アプリと SMSをご覧ください。
Authenticator App - Novaz の場合
Novaz は iPhone 上で標準的な TOTP のコードを生成します。
- QR コードから追加した場合: SHA-1、SHA-256、SHA-512、6〜8桁、1〜300秒の間隔に対応します。
- キーを手入力した場合: 常に6桁、30秒、SHA-1 です。
HOTP のコードは生成しません。また、iPhone の時計を確認し、15秒以上ずれていると警告します。