はじめに
近年、Webサービスにおいて多要素認証の採用が進んでおり、スマートフォン用の認証アプリ(例:Microsoft Authenticatorなど)を使ってコード入力を行う方式が一般的になっています。
この方式で用いられる技術の一つに、ワンタイムパスワードの一種である「TOTP(Time-Based One-Time Password)」があります。
ここでは、TOTPの仕組みと、それを使ったログイン認証の仕組みについて説明します。
TOTPとは
TOTPは “Time-Based One-Time Password” の略で、「時間ベースのワンタイムパスワード」を意味します。
具体的には、サービス(サーバ)とユーザの端末(認証アプリ)で 共通の秘密鍵を持ち、さらに現在時刻を一定の時間ステップ(例:30秒)で区切ったカウンター値を用いて、短時間だけ有効なパスワード(コード)を生成します。
TOTPは、HOTP(HMAC-based One-Time Password)方式を時間ベースに拡張したものといえます。
HOTPでは、試行回数のたびにOTPが変わります。次のようにコードを作ります:
HOTP(K, C) = Truncate( HMAC-SHA1(K, C) ) mod 10^d
K : 秘密鍵
C : カウンター(イベントベース)
d : 桁数(ワンタイムコードの桁数)
カウンターCは「何回目の生成か」というイベント数によって増加します。
TOTP ではこのカウンターを次の式で定義します:
C = floor( (現在のUNIX時間 − T₀) / X₀ )
T₀ : カウント開始時刻(デフォルト 0 = 1970年1月1日 00:00:00 UTC)
X₀ : 時間ステップ(例:30秒)
この仕組みによって、一定時間ごとに新しいコードが生成されます。
認証の仕組み
ざっくりした流れは以下の通りです。
① 秘密鍵の生成・登録
- サーバ側でユーザ専用の**秘密鍵(シークレット)**を生成します。
- ユーザ側(スマートフォンの認証アプリ等)に、QRコードやURL(例:otpauth://)経由でシークレットを登録します。
② コード入力・送信
- ユーザがログイン画面でユーザ名+パスワードを入力し、次に認証アプリを起動して表示された TOTP コード(d 桁)を入力します。
- コードがサーバへ送信されます。
③ サーバ側でのコード検証
- サーバはユーザのシークレットを取得し、現在時刻を元にカウンター値を計算します。
- シークレットとカウンターから TOTP 値を生成します。
- 入力されたコードとサーバで生成したコードを比較します。
- 一致すれば認証成功とし、ログインを許可します。
おわりに
数年前に情報処理安全確保支援士を受験した際、TOTPの仕組みもざっくり学んだのですが、記憶が薄れていたので振り返るいい機会になりました。
普段使っているサービスの仕組みについては、ぼんやりでもいいので理解しておきたいです。