安全なパスワード認証を支えるSRPプロトコル
はじめに
こんにちは、@caru_iniです。今回は、インターネットの安全なパスワード認証を支える SRP プロトコルについて紹介していきます。
SRP (Secure Remote Password) とは
Secure Remote Password (SRP) は、パスワード認証のための認証キー交換プロトコルです。
1997 年にスタンフォード大学で開始されたプロジェクトで、安全、利便性、オープン性、シンプルさを目指して開発されました。
SRP は、パスワードをサーバに送信することがないので、盗聴や中間者攻撃から保護され、安全な認証を提供します。
実際に Amazon Cognito などのサービスで採用されていることもあり、実用性が高いプロトコルです。
主な特徴
SRP は、主に以下の特徴を持っています。
- パスワードをサーバに送信しない
- サーバ側にパスワードのハッシュ値を保存しない
- 秘密鍵はすべて1回限りのランダムな値
おおまかな流れ
はじめから数式を使って説明すると理解が難しいので、まずは簡単な仕組みとおおまかな流れを理解してから、数式を見ていきましょう。
登録時
ユーザーはユーザー名とパスワードを入力すると、クライアント側でランダムなソルトやメールアドレス、パスワードから生成される検証子を生成します。
検証子を用いると、サーバ側でパスワードを保存することなく、パスワードの正当性を検証できます。検証子は不可逆であり、検証子から元のパスワードを復元することはできません。
認証時
最初に、クライアント側でランダムな秘密鍵 a
とそれから生成される効果鍵 A
を生成します。
クライアントはユーザー名とともに公開鍵 A
をサーバに送信します。
サーバ側でも同様にランダムな秘密鍵 b
と検証子v
から生成される公開鍵 B
を生成します。
その後、サーバーは検証子とソルトが保管されているデータベースからソルトを取得し、ソルトと公開鍵B
をクライアントに送信します。
クライアントとサーバーは、それぞれの公開鍵 A
と B
を用いて共有鍵を生成し、それを用いてセッションキーを生成します:
クライアントは、ユーザー名、パスワード、共有鍵、ソルトを用いてセッションキーを生成し、
それをハッシュ化したものをサーバに送信します。
サーバに送信します。
サーバーは、検証子、ソルト、共有鍵を用いてセッションキーを生成します。
最後に、サーバーでセッションキー(正確にはそのハッシュ)が一致するかを確認し、認証結果をクライアントに送信します。
なぜセッションキーが一致するのかは、この後の数学的な説明で詳しく説明します。
数学的な説明
数学的な説明をすると、以下のような数式になります。
記号
-
: ハッシュ -
: 非常に大きく安全な素数。javascript の BigInt
に入り切らないほど大きい -
: modulo での生成元 -
: SRP-6a では、 -
: ソルト -
: ユーザー名 -
: パスワード(平文) -
: ハッシュ化されたソルトとパスワード。 -
, : ランダムな秘密鍵 -
, : , から生成される公開鍵。後述 -
: ランダムスクランブリングパラメータ。後述 -
, : クライアントとサーバーのセッションキー -
: をハッシュ化したもの。正しいとき、
使用する性質 (補足)
- 指数法則:
-
の性質:
例えば、の場合、
要件
ユーザーは、
または を受信した場合に中止する。
ホストは、を検出した場合に中止する。
ユーザーは先にを提示しなければなれない。もしサーバーが の不一致を検知した場合、サーバーは自分の持つ を提示せずに中止する。
http://srp.stanford.edu/design.html より引用
登録時
- ユーザーは、ユーザー名
とパスワード を入力し、クライアント側でランダムなソルト と検証子 を生成します。
- サーバーに送信・保存されるのは、
I
,s
,v
と任意の他の情報のみです。
認証時
- クライアントは、ランダムな秘密鍵
とそれから生成される公開鍵 を生成します。
- サーバーも同様に、ランダムな秘密鍵
と検証子から生成される公開鍵 を生成します。
- クライアントは、ユーザー名
と公開鍵 をサーバーに送信します。 - サーバーは、ユーザー名
からソルト を取得し、公開鍵 をクライアントに送信します。 - クライアントとサーバーは、それぞれの公開鍵
, から共有鍵 を生成します。
- クライアントは、ユーザー名
, パスワード , 共有鍵 , ソルト からセッションキー を生成します。
- サーバーは、検証子
, ソルト , 共有鍵 からセッションキー を生成します。 はそれをハッシュ化したものです。
-
であれば、認証は成功です。
と が一致するのか
なぜ よって、
同様に、
指数法則より、
よって、
よって、
まとめ
SRP プロトコルの特徴や仕組み、数学的な説明を紹介しました。
最初はとても複雑な処理かと思って身構えていましたが、実際は高校数学の範囲で理解できる内容で、とても興味深いものでした。
認証の仕組みに興味を持つとてもいい機会になりました。
このような技術が世の中を支えていることを知ると、非常に感慨深いですね。
間違いやご指摘があれば、下記のコメント欄 or X までお知らせいただけると幸いです。
参考文献
Discussion