共有秘密をオンラインで確立する必要がある場合、SRPについていくつかの実用的な質問があります。
SRPは、すでにクライアントとサーバー間で共有シークレットを持っている状況向けです。コンテキストで自然に発生する「ペアリング」手順の一部として(たとえば、Bluetooth周辺機器用にSRPが提案されています。一方のデバイスには画面があり、コードが表示され、もう一方のデバイスにはコードが入力されるキーパッドがあります) 。このような共有シークレットを取得する機会がまったくない「完全にオンライン」の状況では、SRPにはほとんど利点がありません。セキュリティはどこかで開始する必要があります。
SRPでは、サーバーが実際に保存するのは、パスワードの一種のハッシュです。保存された値は、プロトコルで使用できるように何らかの数学的構造も満たさなければならないため、「一種」のみです。その値をすぐにクライアントとして認証するために使用することはできませんが、ハッシュされたパスワードと同様に、ブルートフォースの影響を受けやすくなります。 SRPの魔法は、ネットワーク上のデータパケットを監視するだけでは、パスワードに辞書攻撃を適用するのに十分ではないということです。ただし、サーバーが格納するものはそのような攻撃を許可します(そして、非常に一般的な方法で、これは避けられません)。
TLS/SRP で現在指定されているように、サーバーに格納されている値は次のように計算されます。
x = SHA1(s | SHA1(I | ":" | P)) v = g^x % N
ここで、s
はソルト、I
はユーザー名、P
はパスワード、v
は保存されているものです(x
は保存されていません)。 g
およびN
はSRPパラメーター(パブリック)です。攻撃者が値v
を取得できる場合は、上記の計算を実行して「パスワードを試す」ことができます。
これはソルトハッシュです(それは良いです)が、非常に高速なハッシュでもあります(それは悪いです)。 SRPは、優れた パスワードハッシュ 関数(bcryptなど)と組み合わせることができますが、次の点に注意してください。