- 時刻と共有シークレットから、一定時間だけ有効なワンタイムパスワードを生成する仕組み
- 一般的に30秒ごとに6桁の数字が変わる(
Google Authenticatorなど) - パスワードの代わりに使う2要素認証(
2FA)でよく使われる
認証の流れ
「サーバーとクライアントが通信してパスワードを答え合わせしている」のではなく、お互いが独立して同じ計算を行い、結果が一致するかを確かめるのが肝。
- 事前準備(1回だけ) — QRコードを読み取ると、サーバーとスマホの両方に同じ共有シークレット(例:
JBSWY3DPEHPK3PXP)がセットされる - ログイン時 — スマホは「現在時刻 + シークレット」から6桁を計算して表示 → ユーザーが入力して送信 → サーバーも同じ材料で独立して計算 → 一致すれば認証成功
スマホはサーバーと通信してコードをもらっているわけではない。内部の時計とシークレットだけで計算するので、オフラインでも正しいコードが表示される。
計算の裏側
- 現在時刻(Unix秒)を30で割って切り捨て → 30秒間は同じ「時間カウント」になる
- そのカウントとシークレットを
HMAC-SHA1に投入 - 結果から6桁の数字を切り出す
なぜ安全か
- 盗まれた6桁は30秒で無効になる(使い回し不可)
- シークレット自体は通信されない