SRP プロトコルについて: http://en.wikipedia.org/wiki/Secure_remote_password_protocol
セッション キー (K) の生成は完全に安全であることがわかりますが、最後のステップでユーザーが K (M) の証明を送信します。ネットワークが安全でなく、中間の攻撃者が M をキャプチャした場合、K がなくても認証できますよね?
SRP プロトコルについて: http://en.wikipedia.org/wiki/Secure_remote_password_protocol
セッション キー (K) の生成は完全に安全であることがわかりますが、最後のステップでユーザーが K (M) の証明を送信します。ネットワークが安全でなく、中間の攻撃者が M をキャプチャした場合、K がなくても認証できますよね?
既知の値 (事前に確立):
n A large prime number. All computations are performed modulo n.
g A primitive root modulo n (often called a generator).
ユーザーのパスワードは次のように設定されます。
x = H(s, P)
v = g^x
H() One-way hash function
s A random string used as the user's salt
P The user's password
x A private key derived from the password and salt
v The host's password verifier
認証:
+---+------------------------+--------------+----------------------+
| | Alice | Public Wire | Bob |
+---+------------------------+--------------+----------------------+
| 1 | | C --> | (lookup s, v) |
| 2 | x = H(s, P) | <-- s | |
| 3 | A = g^a | A --> | |
| 4 | | <-- B, u | B = v + g^b |
| 5 | S = (B - g^x)^(a + ux) | | S = (A · v^u)^b |
| 6 | K = H(S) | | K = H(S) |
| 7 | M[1] = H(A, B, K) | M[1] --> | (verify M[1]) |
| 8 | (verify M[2]) | <-- M[2] | M[2] = H(A, M[1], K) |
+---+------------------------+--------------+----------------------+
u Random scrambling parameter, publicly revealed
a,b Ephemeral private keys, generated randomly and not publicly revealed
A,B Corresponding public keys
m,n The two quantities (strings) m and n concatenated
S Calculated exponential value
K Session key
ご覧のとおり、両者は、それぞれが利用できる値に基づいて、K (= セッション キー) を個別に計算します。
ステップ 2 で入力した Alice のパスワード P が、v を生成するために最初に使用したものと一致する場合、S の両方の値が一致します。
ただし、実際のセッション キー K はネットワーク経由で送信されることはなく、両方の当事者が同じセッション キーの計算に成功したことを証明するだけです。したがって、中間者はプルーフを再送信できますが、実際のセッション キーを持っていないため、傍受されたデータで何もできません。
証明は特定の K に対してのみ有効です。
MITM なし:
Alice <-K-> Bob
アリスは K の証明を作成し、ボブはそれを受け入れます
MITM を使用:
Alice <-K1-> Eve <-K2-> Bob
Alice は K1 の証明を作成しますが、Eve がそれを Bob に提示すると、K2 に適合しないため、Bob は受け入れません。