一. Basic 認證php
客戶端以「 : 」鏈接用戶名和密碼後,再經BASE64編碼( Base64 Content-Transfer-Encoding )經過Authorization請求頭髮送該密文至服務端進行驗證,每次請求都須要重複發送該密文。可見Basic認證過程簡單,安全性也低,存在泄露我的帳號信息以及其餘諸多安全問題,最好在實現了Transport Layer Security (TLS)的狀況下去使用。如下僅爲原理演示,不表明真實狀況:html
GET / HTTP/1.1
Host: www.myrealm.com算法
HTTP/1.1 401 Unauthorised
Server: bfe/1.0.8.18
WWW-Authenticate: Basic realm="myrealm.com"
Content-Type: text/html; charset=utf-8數據庫
GET / HTTP/1.1
Host: www.myrealm.com
Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx編程
二. Digest 認證緩存
Digest認證試圖解決Basic認證的諸多缺陷而設計,用戶密碼在整個認證過程當中是個關鍵性要素。安全
下爲服務端發送的Digest認證響應頭部實例及各指令含義說明:(若是你作PHP開發,其官方文檔中發送WWW-Authenticate頭部時可能各指令之間用了空格,在Chrome下是不會彈出認證對話框的,應該換成」, 「或」,「)服務器
WWW-Authenticate: Digest realm="Restricted area", qop="auth,auth-int", nonce="58e8e52922398", opaque="cdce8a5c95a1427d74df7acbf41c9ce0", algorithm="MD5"
nonce:服務端產生的隨機數,用於增長摘要生成的複雜性,從而增長破解密碼的難度,防範「中間人」與「惡意服務器」等攻擊類型,這是相對於不使用該指令而言的;另外,nonce自己可用於防止重放攻擊,用於實現服務端對客戶端的認證。RFC 2617 建議採用這個隨機數計算公式:nonce = BASE64(time-stamp MD5(time-stamp 「:」 ETag 「:」 private-key)),服務端能夠決定這種nonce時間有效性,ETag(URL對應的資源Entity Tag,在CGI編程中一般須要自行生成ETag和鑑別,可用於鑑別URL對應的資源是否改變,區分不一樣語言、Session、Cookie等)能夠防止對已更新資源版本(未更新無效,故須要設定nonce有效期)的重放請求,private-key爲服務端私有keydom
下爲客戶端發送的Digest認證頭請求部實例及各指令含義說明:ui
Authorization: Digest username="somename", realm="Restricted area", nonce="58e8e52922398", uri="/t.php", response="9c839dde909d270bc5b901c7f80f77d5", opaque="cdce8a5c95a1427d74df7acbf41c9ce0", qop="auth", nc=00000001, cnonce="9c30405c3a67a259"
The countermeasure against this attack(選擇明文攻擊) is for clients to be configured to require the use of the optional "cnonce" directive;this allows the client to vary the input to the hash in a way not chosen by the attacker.
下面將就摘要計算方法進行說明:
H(data) = MD5(data) KD(secret, data) = H(concat(secret, ":", data))
a) 採用MD5算法: A1=(user):(realm):(password) b) 採用MD5-sess算法: A1=H((user):(realm):(password)):nonce:cnonce
a) QoP爲auth或未定義: A2=(request-method):(uri-directive-value) b) QoP爲auth-int: A2=(request-method):(uri-directive-value):H((entity-body))
a) 若qop沒有定義: response = KD(H(A1),<nonce>:H(A2)) = H(H(A1),<nonce>:H(A2)) b) 若qop爲auth或auth-int: response = KD(H(A1),<nonce>:<nc>:<cnonce>:<qop>:H(A2)) = H(H(A1),<nonce>:<nc>:<cnonce>:<qop>:H(A2))
三. 安全風險
假冒服務器欺騙(Spoofing by Counterfeit Servers):對於Basic認證,這種攻擊方式更容易奏效,對於Digest認證則更難,但前提是客戶端必須知道將要使用的是Digest認證。用戶在所使用的認證機制中如何發現這一潛在攻擊樣式應該獲得可見的幫助