0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TOTPを使ったログイン認証の仕組み

0
Posted at

はじめに

近年、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秒)  

この仕組みによって、一定時間ごとに新しいコードが生成されます。

認証の仕組み

ざっくりした流れは以下の通りです。

① 秘密鍵の生成・登録

  1. サーバ側でユーザ専用の**秘密鍵(シークレット)**を生成します。
  2. ユーザ側(スマートフォンの認証アプリ等)に、QRコードやURL(例:otpauth://)経由でシークレットを登録します。

② コード入力・送信

  1. ユーザがログイン画面でユーザ名+パスワードを入力し、次に認証アプリを起動して表示された TOTP コード(d 桁)を入力します。
  2. コードがサーバへ送信されます。

③ サーバ側でのコード検証

  1. サーバはユーザのシークレットを取得し、現在時刻を元にカウンター値を計算します。
  2. シークレットとカウンターから TOTP 値を生成します。
  3. 入力されたコードとサーバで生成したコードを比較します。
  4. 一致すれば認証成功とし、ログインを許可します。

おわりに

数年前に情報処理安全確保支援士を受験した際、TOTPの仕組みもざっくり学んだのですが、記憶が薄れていたので振り返るいい機会になりました。
普段使っているサービスの仕組みについては、ぼんやりでもいいので理解しておきたいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?