私は、特にSRPで始まるPAKEプロトコルを読んでいます RFC2945
サーバーの要件の要点は、サーバーがトリプレット_(username, verifier (v), salt (s))
_を資格情報テーブルに保存することです。
ベリファイア_v = g^x % N
_(_^
_演算子は指数演算です)とx = SHA(<salt> | SHA(<username> | ":" | <raw password>))
これで、認証ダンス中に、クライアントはサーバーからsalt (s)
を取得し、サーバーが使用しているのと同じverifier (v)
を計算します。 ユーザー自身からusername
およびpassword
を収集するため、この値を計算できます。
次のいくつかのステップで、クライアントはサーバーのチャレンジB = (v + g^b) % N
からコンポーネントv
を差し引き、S
から派生したキーに到達できます。
クライアント:S = (B - g^x) ^ (a + u * x) % N
私の質問は、誰かが私のデータベースをハッキングして、クレデンシャルテーブルを_(username, verifier (v), salt (s))
_でダンプすると、各ユーザー名のすべてのベリファイアにすぐにアクセスできるということです。次に、取得したベリファイアを使用してクライアントを模倣し、クライアント側の認証手順を完了するのを阻止するものは何ですか?したがって、実際のusername
とpassword
からverifier (v)
を計算する代わりに、サーバーから悪意を持って取得したベリファイアを使用して、クライアント側の計算を続行し、サーバーと同じキー。
つまり、私の推論では、サーバーがハッキングされて資格情報が漏洩した場合、最終的な結果はプレーンテキストのパスワードを保存していた場合と同じです。
免責事項:私は数学を完全に理解していないことを認めますが、一般に、そのような暗号プロトコルは_(g^a)^b = (g^b)^a = g^ab
_である指数のプロパティに依存しているという概念
攻撃者がサーバーデータベースに違反し、クライアントのユーザーID(u)、検証者(v)、ソルト(s)を取得した場合でも、攻撃者はこの情報を使用してそのクライアントとしてログインすることはできません。
https://en.wikipedia.org/wiki/Secure_Remote_Password_protocol を参照してください。ステップ4では、クライアントが次のようにクライアントセッションキーを計算します。
S_c = pow(B - k * pow(g, x, N), a + u * x, N) [eq 1]
ベリファイアは以前は次のように計算されました。
v = pow(g, x, N) [eq 2]
したがって、検証者を知っている攻撃者は、eq 1を次のように書き換えることができます。
S_c = pow(B - k * v, a + u * x, N) [eq 3]
Bは以前にサーバーから送信されました、kとNは両方の当事者に既知の定数です、aはクライアント側で計算され、クライアントはuを計算するために必要なすべてを持っています、vは違反でサーバーから取得されましたが、xについてはどうですか?クライアントセッションキーを計算する前に、クライアントはまず次のようにxを計算する必要があります。
x = H(s, I, p) [eq 4]
ここで、sはソルト(違反時にサーバーから取得)、IはユーザーID(違反時にサーバーから取得)、pはパスワードです。
パスワードがないと、攻撃者はxを計算できないため、攻撃者はセッションキーを計算できません。セッションキーがないと、クライアントはサーバーで認証できません。つまり、クライアントのu、v、sを知るだけでは、攻撃者はそのクライアントとしてログインできません。攻撃者は、パスワードから計算されるxも知っている必要があります。
ただし、xはプレーンテキストのパスワードと同等です。これが、クライアントがxを格納してはならない理由です。