摘要認證步驟:
1. 客戶端訪問一個受http摘要認證保護的資源。
2. 服務器返回401狀態以及nonce等信息,要求客戶端進行認證。
HTTP/1.1 401 Unauthorized
WWW-Authenticate:
Digest
realm="testrealm@host.com",
qop="auth,auth-int",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
opaque="5ccc069c403ebaf9f0171e9517f40e41"
3. 客戶端將以用戶名,密碼,nonce值,HTTP方法, 和被請求的URI為校驗值基礎而加密(默認為MD5算法)的摘要信息返回給服務器。
認證必須的五個情報:
・ realm : 響應中包含信息
・ nonce : 響應中包含信息
・ username : 用戶名
・ digest-uri : 請求的URI
・ response : 以上面四個信息加上密碼信息,使用MD5算法得出的字符串。
Authorization:
Digest
username="Mufasa", ← 客戶端已知信息
realm="testrealm@host.com", ← 服務器端質詢響應信息
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", ← 服務器端質詢響應信息
uri="/dir/index.html", ← 客戶端已知信息
qop=auth, ← 服務器端質詢響應信息
nc=00000001, ← 客戶端計算出的信息(請求計數器)
cnonce="0a4f113b", ← 客戶端計算出的客戶端nonce
response="6629fae49393a05397450978507c4ef1", ← 最終的摘要信息 ha3
opaque="5ccc069c403ebaf9f0171e9517f40e41" ← 服務器端質詢響應信息
4. 如果認證成功,則返回相應的資源。如果認證失敗,則仍返回401狀態,要求重新進行認證。
特記事項:
1. 避免將密碼作為明文在網絡上傳遞,相對提高了HTTP認證的安全性。
2. 當用戶為某個realm首次設置密碼時,服務器保存的是以用戶名,realm,密碼為基礎計算出的哈希值(ha1),而非密碼本身。
3. 如果qop=auth-int,在計算ha2時,除了包括HTTP方法,URI路徑外,還包括請求實體主體,從而防止PUT和POST請求表示被人篡改。
4. 但是因為nonce本身可以被用來進行摘要認證,所以也無法確保認證后傳遞過來的數據的安全性。
※ nonce:隨機字符串,每次返回401響應的時候都會返回一個不同的nonce。
※ nounce:隨機字符串,每個請求都得到一個不同的nounce。
※ MD5(Message Digest algorithm 5,信息摘要算法)
① 用戶名:realm:密碼 ⇒ ha1
② HTTP方法:URI ⇒ ha2
③ ha1:nonce:nc:cnonce:qop:ha2 ⇒ ha3
---------------------------------------
補充參數說明:
客戶端在后續提交請求時,
重復用服務器密碼隨機數(nonce)
每次產生新的客戶端密碼隨機數(cnonce)
計數器(nc)++ (請求計數器每次都增加1)
然后依 保護質量(qop)類型,確定response 值
服務端收到后,依qop類型,用同樣的算法,算出值與客戶端帶過來的response值對比。
nonce過期處理:
當服務端密碼隨機數nonce過期時,
返回 401,並在認證頭中添加stale=TRUE
// ":"作為各個參數的分割符
HA1 : md5("username:realm:pwd")
HA2 : md5("GET:/xx/xx/index.html")
qop:為"auth"或"auth-int"
Response = md5("HA1:nonce:nc:cnonce:qop:HA2")
qop:未指定
Response = md5("HA1:nonce:HA2")
--------------------
重復用服務器密碼隨機數(nonce)
每次產生新的客戶端密碼隨機數(cnonce)
計數器(nc)++ (請求計數器每次都增加1)
然后依 保護質量(qop)類型,確定response 值
服務端收到后,依qop類型,用同樣的算法,算出值與客戶端帶過來的response值對比。
nonce過期處理:
當服務端密碼隨機數nonce過期時,
返回 401,並在認證頭中添加stale=TRUE
// ":"作為各個參數的分割符
HA1 : md5("username:realm:pwd")
HA2 : md5("GET:/xx/xx/index.html")
qop:為"auth"或"auth-int"
Response = md5("HA1:nonce:nc:cnonce:qop:HA2")
qop:未指定
Response = md5("HA1:nonce:HA2")
--------------------
參考資料
http://blog.csdn.net/jesse881025/article/details/43669625
