1. 程式人生 > 程式設計 >HTTP摘要認證

HTTP摘要認證

典型的認證過程

  • 客戶端請求一個需要認證的頁面,但是不提供[使用者名稱]和[密碼]。通常這是由於使用者簡單的輸入了一個地址或者在頁面中點選了某個[超連結]。

  • 伺服器返回[401] "Unauthorized" 響應程式碼,並提供認證域(realm),以及一個隨機生成的、只使用一次的數值,稱為[密碼隨機數 nonce]。

  • 此時,瀏覽器會向用戶提示認證域(realm)(通常是所訪問的計算機或系統的描述),並且提示使用者名稱和密碼。使用者此時可以選擇取消。

  • 一旦提供了使用者名稱和密碼,客戶端會重新傳送同樣的請求,但是添加了一個認證頭包括了響應程式碼。

  • 在這個例子中,伺服器接受了認證並且返回了請求頁面。如果使用者名稱非法和/或密碼不正確,伺服器將返回"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="[email protected]",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> 複製程式碼
  • 客戶端請求 (使用者名稱 "Mufasa",密碼 "Circle Of Life")
GET /dir/index.html HTTP/1.0
Host: localhost
Authorization: Digest username="Mufasa",realm="[email protected]",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
複製程式碼

response生成的規則

qop: “質量保護”,認證響應由下列組成(HA1、HA2、A1、及A2為字串變數的名稱):

HA1 = MD5(A1)= MD5(username:realm:password)

​ 如果 qop 值為“auth”或未指定,那麼 HA2 為:

HA2 = MD5(A2)= MD5(method:disgestURI)

​ 如果 qop 值為“auth-int”,那麼 HA2 為:

HA2 = MD5(A2)= MD5(method:disgestURI:MD5(entityBody))

如果 qop 值為“auth”或“auth-int”,那麼如下計算 response:

response = MD5(HA1:nonce:nonceCount:clientNonce:qop:HA2)

如果 qop 未指定,那麼如下計算 response:

response = MD5(HA1:nonce:HA2)

計算的示例:

如下所述,response 值由三步計算而成。當多個數值合併的時候,使用[冒號]作為分割符。

  1. 對使用者名稱、認證域(realm)以及密碼的合併值計算 MD5 雜湊值,結果稱為 HA1。
  2. 對HTTP方法以及[URI]的摘要的合併值計算 MD5 雜湊值,例如,"GET""/dir/index.html",結果稱為 HA2。
  3. 對 HA1、伺服器密碼隨機數(nonce)、請求計數(nc)、客戶端密碼隨機數(cnonce)、保護質量(qop)以及 HA2 的合併值計算 MD5 雜湊值。結果即為客戶端提供的 response 值。
   HA1 = MD5( "Mufasa:[email protected]: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 值。

WWW-Authenticate 響應頭引數說明

username: 使用者名稱(網站定義)
password: 密碼
realm:&emsp;伺服器返回的realm,一般是域名
method: 請求的方法
nonce: 伺服器發給客戶端的隨機的字串
nc(nonceCount):請求的次數,用於標記,計數,防止重放攻擊
cnonce(clinetNonce): 客戶端傳送給伺服器的隨機字串
qop: 保護質量引數,一般是auth,或auth-int,這會影響摘要的演演算法
uri: 請求的uri(只是path)
response:&emsp;客戶端根據演演算法算出的摘要值
複製程式碼

opaque:由伺服器指定的字串,客戶端在後續指向同一個受保護區間的請求中應該在 Authorization 頭中原樣返回,建議使用 base64 或者 16 進位制數。