私が https://security.stackexchange.com/a/3024/13447 で答えを理解している限り、クライアントナンスは攻撃者が計算結果を再利用できるため、ブルートフォースハッシュ計算のコスト
ただし、最も単純なダイジェスト認証のバリアント(qop = none)でも、username
とrealm
(サーバーごとに一意であると思われる)およびnonce
(サーバーごとの一意ではありません)サーバー)は、(通常はMD5で)ハッシュされるデータに含まれます。
これにより、ユーザー/サーバー間で事前計算されたハッシュを再利用することはすでに不可能になっていないのですか?
したがって、クライアントnonceは http://tools.ietf.org/html/rfc2617#section-4.9 が正しい場合にのみセキュリティを追加します。
ナンスを選択する機能は、暗号解読をはるかに簡単にすることが知られています[8]。
しかし、その同じセクションは続けて言う
ただし、選択されたプレーンテキストを使用してダイジェストで使用されるMD5一方向関数を分析する方法は現在知られていません。
これは1999年の声明です。それ以来、MD5に対してさまざまな衝突攻撃が公開されていますが、私が誤解していなければ、この場合は役に立ちません。
何が欠けていますか?
更新私たちが話していることを正確に綴ることは理にかなっていると思います。ダイジェスト認証の最も基本的な形式では、クライアントは次の結果を計算してサーバーに送信します。
MD5(MD5(username + ":" + REALM + ":" + password)
+ ":" + NONCE + ":" +
MD5(http-method) + ":" + uri))
パスワードを除いて、すべての値もプレーンテキストで送信されます。
より明確にするために、値がクライアントによって設定されている変数は小文字ですが、クライアントが取得する変数はサーバーは大文字です。 (これにより、上記の「レルムとノンス」の誤解がすぐに明らかになります。DavidWachtfogelが指摘したように、MITMはこれらの大文字の値を自由に選択できます。ほとんどの管理者のパスワードで見られたveは、例外というよりはむしろ標準です。
ところで、uriの値はhttp://servername/path?query
のように絶対uriであると想定されているため、グローバルに一意になりますが、クライアントの実装とOperaがそれをそのように実装するのに対し、Chromeのバージョン、IE、Firefox私はテストしましたしないでください、むしろ単に '/ path?query'を使用します(これは http://tools.ietf.org/html/rfc2617#section-3.2.2.5 )。
したがって、事前計算されたテーブルがサーバー間で再利用できるかどうかはクライアントの実装に依存します。MITMが選択できる場合、当然、事前計算されたテーブルがある場合は、弱いブラウザをOperaよりも優先します。
この質問で引用されている Thomas Pornin's answer で説明されているように、クライアントナンスの目的は、攻撃者がサーバーになりすましてチャレンジを選択する、選択されたプレーンテキスト攻撃を防ぐことです。そのような状況では、攻撃者はレルムを選択することもできます(これはサーバーからのものであるため)。レルムが応答の一部としてハッシュされるという事実は、この攻撃を完全に防ぐわけではありません。ユーザーが警戒していて、レルムが期待どおりであることを確認した場合のみ、これにより攻撃が防止されます。
ユーザー名は、レインボーテーブルなどの事前に計算されたハッシュテーブルをユーザー名ごとに作成することを攻撃者に要求するという点で役立ちます。問題は、ユーザー名がグローバルに一意ではないことです。同じユーザー名が多くの異なるサーバーに存在します。実際、一部のユーザー名は非常に一般的で、ほとんどのサーバーに表示される可能性があります-典型的な例は「admin」です。
したがって、攻撃者は次のことが可能です。
クライアントノンスはこの種の攻撃を防ぎます。攻撃者はこのナンスを制御および予測できないため、攻撃者は事前計算されたハッシュテーブルを作成できません。
ユーザー名とレルム(おそらくサーバーごとに一意)
これは正しくありません。レルムは、保護レルムを説明するためにサービスプロバイダーによって指定された値であるため、グローバル識別子ではなく名前にすぎません。
2番目の引用では、MD5の「一方向性」が壊れていないことを指していると思います。プリイメージを見つける最も効果的な方法(つまり、値Y = MD5(x)からxを見つける)には2が必要です。123.4 操作。
cnonceは、「クライアントによって提供され、クライアントとサーバーの両方で使用される不透明な文字列であり、選択された平文攻撃を回避し、相互認証を提供し、メッセージの整合性を保護します。」[ [〜#〜] rfc [ 〜#〜] ] nonceとともに、それは持続的な相互認証を容易にします:サーバーに対するクライアントの認証、そしてその逆です。