一. Basic 認(rèn)證
創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)成都營(yíng)銷(xiāo)網(wǎng)站建設(shè)、網(wǎng)站重做改版、且末網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為且末等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
客戶(hù)端以“ : ”連接用戶(hù)名和密碼后,再經(jīng)BASE64加密通過(guò)Authorization請(qǐng)求頭發(fā)送該密文至服務(wù)端進(jìn)行驗(yàn)證,每次請(qǐng)求都需要重復(fù)發(fā)送該密文??梢?jiàn)Basic認(rèn)證過(guò)程簡(jiǎn)單,安全性也低,存在泄露個(gè)人賬號(hào)信息以及其他諸多安全問(wèn)題。以下僅為原理演示,不代表真實(shí)情況:
客戶(hù)端向服務(wù)器請(qǐng)求數(shù)據(jù):
GET / HTTP/1.1
Host: www.myrealm.com
服務(wù)端向客戶(hù)端發(fā)送驗(yàn)證請(qǐng)求401:
HTTP/1.1 401 Unauthorised
Server: bfe/1.0.8.18
WWW-Authenticate: Basic realm="myrealm.com"
Content-Type: text/html; charset=utf-8
客戶(hù)端收到401返回值后,將自動(dòng)彈出一個(gè)登錄窗口,等待用戶(hù)輸入用戶(hù)名和密碼
將“用戶(hù)名:密碼”進(jìn)行BASE64加密后發(fā)送服務(wù)端進(jìn)行驗(yàn)證:
GET / HTTP/1.1
Host: www.myrealm.com
Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx
服務(wù)端取出Authorization請(qǐng)求頭信息進(jìn)行解密,并與用戶(hù)數(shù)據(jù)庫(kù)進(jìn)行對(duì)比判斷是否合法,合法將返回200 OK。RFC 2617 規(guī)格中Basic認(rèn)證不發(fā)送Authentication-Info頭部,Authentication-Info頭部是Digest認(rèn)證中新增的
1 Hello {$_SERVER['PHP_AUTH_USER']}."; 9 echo "You entered {$_SERVER['PHP_AUTH_PW']} as your password.
";10 }
二. Digest 認(rèn)證
Digest認(rèn)證試圖解決Basic認(rèn)證的諸多缺陷而設(shè)計(jì),用戶(hù)密碼在整個(gè)認(rèn)證過(guò)程中是個(gè)關(guān)鍵性要素。
下為服務(wù)端發(fā)送的Digest認(rèn)證響應(yīng)頭部實(shí)例及各指令含義說(shuō)明:PHP官方文檔中發(fā)送WWW-Authenticate頭部時(shí)各指令之間用了空格,在Chrome下是不會(huì)彈出認(rèn)證對(duì)話(huà)框的,應(yīng)該換成”, “或”,“
WWW-Authenticate: Digest realm="Restricted area", qop="auth,auth-int", nonce="58e8e52922398", opaque="cdce8a5c95a1427d74df7acbf41c9ce0", algorithm="MD5"
WWW-Authenticate:服務(wù)端發(fā)送的認(rèn)證質(zhì)詢(xún)頭部
Authentication-Info:服務(wù)端發(fā)送的認(rèn)證響應(yīng)頭部,包含nextnonce、rspauth響應(yīng)摘要等
realm:授權(quán)域,至少應(yīng)該包含主機(jī)名
domain:授權(quán)訪(fǎng)問(wèn)URIs列表,項(xiàng)與項(xiàng)之間以空格符分隔
qop:質(zhì)量保護(hù),值為auth或auth-int或[token],auth-int包含對(duì)實(shí)體主體做完整性校驗(yàn)
nonce:服務(wù)端產(chǎn)生的隨機(jī)數(shù),用于增加摘要生成的復(fù)雜性,從而增加破解密碼的難度,防范“中間人”與“惡意服務(wù)器”等***類(lèi)型,這是相對(duì)于不使用該指令而言的;另外,nonce本身可用于防止重放***,用于實(shí)現(xiàn)服務(wù)端對(duì)客戶(hù)端的認(rèn)證。RFC 2617 建議采用這個(gè)隨機(jī)數(shù)計(jì)算公式:nonce = BASE64(time-stamp MD5(time-stamp “:” ETag “:” private-key)),服務(wù)端可以決定這種nonce時(shí)間有效性,ETag(URL對(duì)應(yīng)的資源Entity Tag,在CGI編程中通常需要自行生成ETag和鑒別,可用于鑒別URL對(duì)應(yīng)的資源是否改變,區(qū)分不同語(yǔ)言、Session、Cookie等)可以防止對(duì)已更新資源版本(未更新無(wú)效,故需要設(shè)定nonce有效期)的重放請(qǐng)求,private-key為服務(wù)端私有key
opaque:這是一個(gè)不透明的數(shù)據(jù)字符串,在盤(pán)問(wèn)中發(fā)送給客戶(hù)端,客戶(hù)端會(huì)將這個(gè)數(shù)據(jù)字符串再發(fā)送回服務(wù)端器。如果需要在服務(wù)端和客戶(hù)端之間維護(hù)一些狀態(tài),用nonce來(lái)維護(hù)狀態(tài)數(shù)據(jù)是一種更容易也更安全的實(shí)現(xiàn)方式
stale:nonce過(guò)期標(biāo)志,值為true或false
algorithm:摘要算法,值為MD5或MD5-sess或[token],默認(rèn)為MD5
下為客戶(hù)端發(fā)送的Digest認(rèn)證頭請(qǐng)求部實(shí)例及各指令含義說(shuō)明:
Authorization: Digest username="somename", realm="Restricted area", nonce="58e8e52922398", uri="/t.php", response="9c839dde909d270bc5b901c7f80f77d5", opaque="cdce8a5c95a1427d74df7acbf41c9ce0", qop="auth", nc=00000001, cnonce="9c30405c3a67a259"
cnonce:客戶(hù)端產(chǎn)生的隨機(jī)數(shù),用于客戶(hù)端對(duì)服務(wù)器的認(rèn)證。由于“中間人”與“惡意服務(wù)器”等***方式的存在,導(dǎo)致一個(gè)特意選擇而非隨機(jī)唯一的nonce值傳給客戶(hù)端用于摘要的計(jì)算成為可能,使得“選擇性明文***”可能奏效,最后用戶(hù)密碼泄露。因此與nonce一樣,cnonce可用于增加摘要生成的復(fù)雜性,從而增加破解密碼的難度,也就保證了對(duì)服務(wù)端的認(rèn)證
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.
nc:當(dāng)服務(wù)端開(kāi)啟qop時(shí),客戶(hù)端才需要發(fā)送nc(nonce-count)。服務(wù)端能夠通過(guò)維護(hù)nc來(lái)檢測(cè)用當(dāng)前nonce標(biāo)記的請(qǐng)求重放。如果相同的nc出現(xiàn)在用當(dāng)前nonce標(biāo)記的兩次請(qǐng)求中,那么這兩次請(qǐng)求即為重復(fù)請(qǐng)求。所以對(duì)于防止重放***而言,除了nonce之外,nc才是最后的保障。因此服務(wù)端除了維護(hù)用戶(hù)賬號(hào)信息之外,還需要維護(hù)nonce和nc的關(guān)聯(lián)狀態(tài)數(shù)據(jù)
下面將就摘要計(jì)算方法進(jìn)行說(shuō)明:
算法的一般性表示
H(data) = MD5(data) KD(secret, data) = H(concat(secret, ":", data))
與安全信息相關(guān)的數(shù)據(jù)用A1表示,則
a) 采用MD5算法: A1=(user):(realm):(password) b) 采用MD5-sess算法: A1=H((user):(realm):(password)):nonce:cnonce
與安全信息無(wú)關(guān)的數(shù)據(jù)用A2表示,則
a) QoP為auth或未定義: A2=(request-method):(uri-directive-value) b) QoP為auth-int: A2=(request-method):(uri-directive-value):H((entity-body))
摘要值用response表示,則
a) 若qop沒(méi)有定義: response = KD(H(A1),:H(A2)) = H(H(A1), :H(A2)) b) 若qop為auth或auth-int: response = KD(H(A1), : : : :H(A2)) = H(H(A1), : : : :H(A2))
三. 安全風(fēng)險(xiǎn)
在線(xiàn)字典***(Online dictionary attacks):***者可以嘗試用包含口令的字典進(jìn)行模擬計(jì)算response,然后與竊聽(tīng)到的任何nonce / response對(duì)進(jìn)行對(duì)比,若結(jié)果一致則***成功。為應(yīng)對(duì)針對(duì)弱口令的字典***,降低***成功的可能性,可以禁止用戶(hù)使用弱口令
中間人(Man in the Middle):在一次中間人***中,一個(gè)弱認(rèn)證方案被添加并提供給客戶(hù)端,因此你總是應(yīng)該從多個(gè)備選認(rèn)證方案中選擇使用最強(qiáng)的那一個(gè);甚至中間人可能以Basic認(rèn)證替換掉服務(wù)端提供的Digest認(rèn)證,從而竊取到用戶(hù)的安全憑證,然后中間人可利用該憑證去響應(yīng)服務(wù)端的Digest認(rèn)證盤(pán)問(wèn);***者還可能打著免費(fèi)緩存代理服務(wù)的幌子來(lái)招攬輕信者,通過(guò)實(shí)施中間人***,盜取他們的安全憑證;中間代理也可能誘導(dǎo)客戶(hù)端來(lái)發(fā)送一個(gè)請(qǐng)求給服務(wù)端。為此,客戶(hù)端可考慮給出安全等級(jí)風(fēng)險(xiǎn)警示,或在跟蹤服務(wù)端的認(rèn)證配置時(shí)發(fā)現(xiàn)其認(rèn)證強(qiáng)度降低就發(fā)出警告,或配置成只使用強(qiáng)認(rèn)證,或從指定站點(diǎn)來(lái)完成認(rèn)證
預(yù)先計(jì)算字典***(Precomputed dictionary attacks):***者先構(gòu)建(response, password) 對(duì)字典,然后用選擇性明文(nonce)***的辦法來(lái)獲得相應(yīng)盤(pán)問(wèn)的response,檢索字典找到匹配的response則***成功
批量式暴力***(Batch brute force attacks):中間人會(huì)對(duì)多個(gè)用戶(hù)執(zhí)行選擇性明文***來(lái)搜集相應(yīng)的responses,通過(guò)控制搜集的nonce / response對(duì)的數(shù)量將會(huì)縮短找到第一個(gè)password的耗時(shí),這種***的應(yīng)對(duì)之策就是要求客戶(hù)端使用cnonce指令
假冒服務(wù)器欺騙(Spoofing by Counterfeit Servers):對(duì)于Basic認(rèn)證,這種***方式更容易奏效,對(duì)于Digest認(rèn)證則更難,但前提是客戶(hù)端必須知道將要使用的是Digest認(rèn)證。用戶(hù)在所使用的認(rèn)證機(jī)制中如何發(fā)現(xiàn)這一潛在***樣式應(yīng)該得到可見(jiàn)的幫助