ダイジェスト認証とは何ですか?


101

ダイジェスト認証は、資格情報をプレーンテキストとして送信する以外は、基本認証とどのように異なりますか?


1
@Gumboによる素晴らしい説明:stackoverflow.com/a/5288679/591487
inorganik

2
絶対に使用しないでください。転送中のパスワードを保護せず、サーバーにパスワードを平文で保存するよう要求します。
CodesInChaos 2015

2
ダイジェストは、暗号化されていないトラフィックに対して基本認証よりも優れた転送中のセキュリティを提供しますが、弱いです。代わりにSSL / TLSと組み合わせて基本認証を使用する方がはるかに安全です。これにより、サーバー上のパスワードを暗号化しておくこともできます。
rustyx

回答:


178

主な違いは、ユーザー名とパスワードをネットワーク経由でプレーンテキストで送信する必要がないことです。また、サーバーからの1回限りの番号を使用するため、リプレイ攻撃の影響を受けません。

サーバーはクライアントに、ユーザー名、レルム、パスワード、およびURI要求と組み合わせる1回限りの使用番号(ナンス)を提供します。クライアントは、これらすべてのフィールドをMD5ハッシュ方式で実行して、ハッシュキーを生成します。

認証を試みるために、このハッシュキーをユーザー名およびレルムとともにサーバーに送信します。

サーバー側で同じ方法を使用してハッシュキーを生成します。ブラウザに入力されたパスワードを使用する代わりに、サーバーはユーザーの予想されるパスワードをユーザーDBから検索します。保存されているこのユーザー名のパスワードを検索し、同じアルゴリズムを実行して、クライアントが送信したものと比較します。それらが一致する場合、アクセスが許可されます。それ以外の場合は、401 Unauthorized(ログインなしまたはログイン失敗)または403 Forbidden(アクセス拒否)を送信できます。

ダイジェスト認証はRFC2617標準化されていますウィキペディアにそれの素晴らしい概要があります

次のように考えることができます。

  1. クライアントがリクエストする
  2. クライアントはサーバーからナンスと401認証要求を受け取ります
  3. クライアントは次の応答配列(ユーザー名、レルム、generate_md5_key(nonce、ユーザー名、レルム、URI、password_given_by_user_to_browser))を送り返します(そうです、それは非常に単純化されています)
  4. サーバーはユーザー名とレルムを受け取り(さらに、クライアントが要求しているURIを知っています)、そのユーザー名のパスワードを検索します。次に、独自のバージョンのgenerate_md5_key(nonce、username、realm、URI、password_I_have_for_this_user_in_my_db)を実行します
  5. クライアントが正しいパスワードを送信した場合、クライアントが送信したものと、generate_md5()の出力を比較します。それらが一致しない場合、送信されたパスワードは間違っていました。

いい説明。Windowsユーザーのユーザー名とパスワードはありますか?どこから生成されますか?
SoftwareGeek

これらは、ユーザーがブラウザに入力するものです。パスワードは、サーバーがそのユーザーのパスワード用に保存したものと一致する必要があります。多くの場合、それはそのWebアプリケーションに固有のものであり、Windowsパスワードではありません。これは、Webアプリケーションの組み立て方に大きく依存します。
Ian C.

14
この回答は6年前のものですが、セキュリティを意識したシステムはすべて、パスワードをソルトハッシュ形式で保存していると思います。ダイジェスト認証を不可能にするデータベースから元のパスワードを取得する方法はなく、またあるはずもありません。
Ramon de Klein

3
ユーザー名とパスワードのダイジェストハッシュではなく、プレーンパスワードのDBに格納されている場合、それはAUTH @RamondeKleinを消化使用することは可能だ
karakays

1
@BlueBockser karakaysは、プレーンなパスワードを使用する代わりに、ユーザー名とパスワードの両方を組み合わせた結果のハッシュを、サインアップ時にサーバーに保存し、認証する前にクライアント側で計算することを意味したと思います。パスワードのハッシュだけで行うこともできます。
logo_writer 2017

14

資格情報のハッシュがネットワーク経由で送信されます。

HA1 = MD5(username:realm:password)

ウィキペディアにはこのトピックに関する優れた記事があります


クライアントからサーバーへ?やり取りの手順を教えていただけませんか?ウィキペディアの記事は良いですが、もっと良い説明や例が必要です。
SoftwareGeek

はい、クライアントはハッシュ値を生成してサーバーに送信します。ウィキペディアの記事では、プロトコルについて詳しく説明しています。詳しくは、プロトコルを参照することをお勧めします。
フィリップフーリー

1

資格情報のハッシュHA1を取得する唯一の方法は、パスワードを知ることです。サーバーはHA1を認識していますが、HA1を生成したパスワードは認識していません。HA1が攻撃者に知られている場合、システムに侵入する可能性があります。そのため、ネットワークに送信されません。これを行う前に、ナンスなどに基づいてさらにハッシュが行われます。これは、サーバーで行われる同様の計算と一致する必要があります。したがって、サーバーがHA1をプライベートに保つ限り、システムは安全です。


これは、ダイジェスト認証の説明です。ここでは、パスワードはプレーンテキストで送信されません(これは、基本認証の場合です)
Erik Oppedijk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.