TOTP(Time-based One-Time Password)

  • 時刻と共有シークレットから、一定時間だけ有効なワンタイムパスワードを生成する仕組み
  • 一般的に30秒ごとに6桁の数字が変わる(Google Authenticatorなど)
  • パスワードの代わりに使う2要素認証(2FA)でよく使われる

認証の流れ

「サーバーとクライアントが通信してパスワードを答え合わせしている」のではなく、お互いが独立して同じ計算を行い、結果が一致するかを確かめるのが肝。

  1. 事前準備(1回だけ) — QRコードを読み取ると、サーバーとスマホの両方に同じ共有シークレット(例: JBSWY3DPEHPK3PXP)がセットされる
  2. ログイン時 — スマホは「現在時刻 + シークレット」から6桁を計算して表示 → ユーザーが入力して送信 → サーバーも同じ材料で独立して計算 → 一致すれば認証成功

スマホはサーバーと通信してコードをもらっているわけではない。内部の時計とシークレットだけで計算するので、オフラインでも正しいコードが表示される。

計算の裏側

  1. 現在時刻(Unix秒)を30で割って切り捨て → 30秒間は同じ「時間カウント」になる
  2. そのカウントとシークレットを HMAC-SHA1 に投入
  3. 結果から6桁の数字を切り出す

なぜ安全か

  • 盗まれた6桁は30秒で無効になる(使い回し不可)
  • シークレット自体は通信されない