客戶端請求一個須要認證的頁面,可是不提供[用戶名]和[密碼]。一般這是因爲用戶簡單的輸入了一個地址或者在頁面中點擊了某個[超連接]。html
服務器返回[401] "Unauthorized" 響應代碼,並提供認證域(realm),以及一個隨機生成的、只使用一次的數值,稱爲[密碼隨機數 nonce]。c++
此時,瀏覽器會向用戶提示認證域(realm)(一般是所訪問的計算機或系統的描述),而且提示用戶名和密碼。用戶此時能夠選擇取消。算法
一旦提供了用戶名和密碼,客戶端會從新發送一樣的請求,可是添加了一個認證頭包括了響應代碼。shell
在這個例子中,服務器接受了認證而且返回了請求頁面。若是用戶名非法和/或密碼不正確,服務器將返回"401"響應代碼,而後客戶端會再次提示用戶輸入用戶名及密碼。瀏覽器
客戶端請求 (無認證)服務器
GET /dir/index.html HTTP/1.0
Host: localhost
複製代碼
HTTP/1.0 401 Unauthorized
Server: HTTPd/0.9
Date: Sun, 10 Apr 2005 20:26:47 GMT
WWW-Authenticate: Digest realm="testrealm@host.com",
qop="auth,auth-int",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
Content-Type: text/html
Content-Length: 311
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<HTML>
<HEAD>
<TITLE>Error</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
</HEAD>
<BODY><H1>401 Unauthorized.</H1></BODY>
</HTML>
複製代碼
GET /dir/index.html HTTP/1.0
Host: localhost
Authorization: Digest username="Mufasa",
realm="testrealm@host.com",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
uri="/dir/index.html",
qop=auth,
nc=00000001,
cnonce="0a4f113b",
response="6629fae49393a05397450978507c4ef1",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
複製代碼
HTTP/1.0 200 OK
Server: HTTPd/0.9
Date: Sun, 10 Apr 2005 20:27:03 GMT
Content-Type: text/html
Content-Length: 7984
複製代碼
qop: 「質量保護」, 認證響應由下列組成(HA一、HA二、A一、及A2爲字符串變量的名稱):網站
若是 qop 值爲「auth」或未指定,那麼 HA2 爲:spa
若是 qop 值爲「auth-int」,那麼 HA2 爲:code
若是 qop 值爲「auth」或「auth-int」,那麼以下計算 response:cdn
若是 qop 未指定,那麼以下計算 response:
計算的示例:
以下所述,response 值由三步計算而成。當多個數值合併的時候,使用[冒號]做爲分割符。
"GET"
和 "/dir/index.html"
,結果稱爲 HA2。HA1 = MD5( "Mufasa:testrealm@host.com:Circle Of Life" )
= 939e7578ed9e3c518a452acee763bce9
HA2 = MD5( "GET:/dir/index.html" )
= 39aff3a2bab6126f332b942af96d3366
Response = MD5("939e7578ed9e3c518a452acee763bce9:dcd98b7102dd2f0e8b11d0f600bfb0c093:00000001:0a4f113b:auth:39aff3a2bab6126f332b942af96d3366" )
= 6629fae49393a05397450978507c4ef1
複製代碼
此時客戶端能夠提交一個新的請求,重複使用服務器密碼隨機數(nonce)(服務器僅在每次「401」響應後發行新的nonce),可是提供新的客戶端密碼隨機數(cnonce)。在後續的請求中,十六進制請求計數器(nc)必須比前一次使用的時候要大,不然攻擊者能夠簡單的使用一樣的認證信息[重放]老的請求。由服務器來確保在每一個發出的密碼隨機數nonce時,計數器是在增長的,並拒絕掉任何錯誤的請求。顯然,改變HTTP方法和/或計數器數值都會致使不一樣的 response 值。
username: 用戶名(網站定義)
password: 密碼
realm: 服務器返回的realm,通常是域名
method: 請求的方法
nonce: 服務器發給客戶端的隨機的字符串
nc(nonceCount):請求的次數,用於標記,計數,防止重放攻擊
cnonce(clinetNonce): 客戶端發送給服務器的隨機字符串
qop: 保護質量參數,通常是auth,或auth-int,這會影響摘要的算法
uri: 請求的uri(只是path)
response: 客戶端根據算法算出的摘要值
複製代碼
opaque:由服務器指定的字符串,客戶端在後續指向同一個受保護區間的請求中應該在 Authorization 頭中原樣返回,建議使用 base64 或者 16 進制數。