すべての記事

TOTP:認証アプリのワンタイムコードはどう機能するか

日本のネットバンキングは長らく、専用のハードウェアトークンや、乱数表・電子証明書といった独自の認証手段に頼ってきた。マイナンバーカードと連携する「マイナポータル」のような行政サービスも、当初は専用のICカードリーダーを前提にしていた歴史がある。TOTPはこうした専用機器を必要とせず、スマートフォン1台と共有シークレットだけで同等の安全性を実現する、より軽量なアプローチだ。

共有シークレットと時間

設定時に、サーバーと認証アプリは1つの共有シークレット鍵を交換します(これがQRコードにエンコードされているものです)。その後、双方は独立して、そのシークレットと現在のUnix時刻(30秒間隔に丸められたもの)からHMACを計算し——互いに通信することなく同じコードにたどり着きます。

これがインターネットなしで機能する理由

コードはデバイスのシークレットとシステムクロックからローカルで計算されるため、認証アプリはコードを生成するためにネットワーク接続を必要としません。唯一の要件は、サーバーと携帯電話の時計が許容される小さな範囲内(通常は±30~60秒)で同期していることです。

コードが30秒ごとに変わる理由

短い時間間隔は、傍受されたコードが有効なままである時間を制限し、攻撃者による再利用のリスクを減らします。サーバーは通常、コード入力時のわずかなネットワーク遅延を補うため、現在の間隔と直前の間隔の両方を受け入れます。

なぜこれが必要か

  • 認証アプリの設定やトラブルシューティング時に二要素認証の仕組みを理解する。
  • 認証システムを開発する際に自分のTOTP実装をテストする。
  • 携帯電話から手動で入力することなく、自動テスト用のコードを生成する。

TOTPが守らないもの

TOTPはパスワード単独の盗難からはしっかり保護しますが、リアルタイムのフィッシングには対応できません——被害者が偽サイトにパスワードと現在のTOTPコードの両方を入力すると、攻撃者はそのコードがまだ有効なうちに、両方の値を即座に本物のサイトで使うことができます。このような攻撃から守れるのは、特定のドメインに暗号学的に紐づけられたFIDO2/WebAuthn規格のハードウェアキーだけです。

ツールを試す