Digest認証

Digest認証（ダイジェストにんしょう）とは、HTTPの認証方法（HTTP認証）の一つ。ユーザ名とパスワードを暗号学的ハッシュ関数でハッシュ（ダイジェスト）化して送る。Basic認証では防げなかった盗聴や改竄を防ぐために考案された。

使用する暗号学的ハッシュ関数としては、当初MD5が規定され、後にでSHA-2（SHA2-256およびSHA-512/256）が加わっている。

 例 
典型的なDigest認証におけるHTTPクライアントとHTTPサーバの間の通信を紹介する。

だいたいの流れは以下のようになる。

 クライアントは認証が必要なページをリクエストする。しかし、通常ここではユーザ名とパスワードを送っていない。なぜならばクライアントはそのページが認証を必要とするか否かを知らないためである。
 サーバは401レスポンスコードを返し、認証領域 (realm) や認証方式（Digest）に関する情報をクライアントに返す。このとき、ランダムな文字列（nonce）とサーバーがサポートしている qop (quality of protection) を示す引用符で囲まれた１つまたは複数のトークンも返される。
 それを受けたクライアントは、認証領域（通常は、アクセスしているサーバやシステムなどの簡単な説明）をユーザに提示して、ユーザ名とパスワードの入力を求める。ユーザはここでキャンセルすることもできる。
 ユーザによりユーザ名とパスワードが入力されると、クライアントはnonceとは別のランダムな文字列（cnonce）を生成する。そして、ユーザ名とパスワードとこれら2つのランダムな文字列などを使ってハッシュ文字列（response）を生成する。
 クライアントはサーバから送られた認証に関する情報(ユーザ名, realm, nc(nonce count), nonce, cnonce, qop)とともに、responseをサーバに送信する。
 サーバ側では、クライアントから送られてきたランダムな文字列（nonce、cnonce）などとサーバに格納されているハッシュ化されたパスワードから、正解のハッシュを計算する。
 この計算値とクライアントから送られてきたresponseとが一致する場合は、認証が成功し、サーバはコンテンツを返す。不一致の場合は再び401レスポンスコードが返され、それによりクライアントは再びユーザにユーザ名とパスワードの入力を求める。

ユーザ名とパスワードの具体的な計算は以下のようになる。なお、ここでは認証アルゴリズムがMD5の時の計算方法を示す。

クライアントが計算するresponseは以下のようにして求められる：
 A1 = ユーザ名 ":" realm ":" パスワード
 A2 = HTTPのメソッド ":" コンテンツのURI
 response = MD5( MD5(A1) ":" nonce ":" nc ":" cnonce ":" qop ":" MD5(A2) )
サーバ側では、MD5(A1) をあらかじめ計算し格納してある。nonce, nc, cnonce, qopとHTTPのメソッド（GETなど）とコンテンツのURIはクライアントから送られてくるので、サーバ側でもresponseの正解を計算できる。

 関連項目 
 HTTP認証
 Basic認証
 MD5

 外部リンク 
  - HTTP Digest Access Authentication
 旧式となった規定
  - An Extension to HTTP: Digest Access Authentication
  - HTTP Authentication: Basic and Digest Access Authentication
  - Hypertext Transfer Protocol (HTTP) Digest Authentication Using Authentication and Key Agreement (AKA) 

Category:HTTP
Category:暗号化プロトコル
Category:ハッシュ関数