本文へスキップ
Novaz Authenticator入手

2FA のコードの仕組み:TOTP をわかりやすく解説

執筆:Novaz チーム · 更新日:2026年10月29日
Novaz の手順はバージョン 1.0.5 で確認済み

このページは英語のガイドを翻訳したものです。サービスのウェブサイト上のボタンやメニューは、日本語では名称が多少異なる場合があります。

このページの内容
  1. 材料1:設定キー
  2. 材料2:一定間隔で数える時刻
  3. 2つを混ぜてコードにする
  4. サイトがコードを受け付ける理由
  5. サービスが変更できる設定
  6. TOTP と HOTP
  7. TOTP が防げないこと
  8. Authenticator App - Novaz の場合

認証アプリとサイトは、双方が持っている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)で定められた方法で、結果を短い数字に切り詰めます。

  1. HMAC の結果の最後の4ビットで、結果の中の位置を決めます。
  2. その位置から31ビットを取り出し、数値として扱います。
  3. その数値の下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秒以上ずれていると警告します。