详解摘要认证
1. 什么是摘要認(rèn)證
摘要認(rèn)證與基礎(chǔ)認(rèn)證的工作原理很相似,用戶先發(fā)出一個(gè)沒有認(rèn)證證書的請(qǐng)求,Web服務(wù)器回復(fù)一個(gè)帶有WWW-Authenticate頭的響應(yīng),指明訪問所請(qǐng)求的資源需要證書。但是和基礎(chǔ)認(rèn)證發(fā)送以Base?64編碼的用戶名和密碼不同,在摘要認(rèn)證中服務(wù)器讓客戶端選一個(gè)隨機(jī)數(shù)(稱作”nonce“),然后瀏覽器使用一個(gè)單向的加密函數(shù)生成一個(gè)消息摘要(message?digest),該摘要是關(guān)于用戶名、密碼、給定的nonce值、HTTP方法,以及所請(qǐng)求的URL。
2. 摘要認(rèn)證算法
摘要認(rèn)證規(guī)范最早定義在RFC 2069中,RFC 2069定義了由服務(wù)器生成隨機(jī)數(shù)來維護(hù)安全性的摘要認(rèn)證架構(gòu),認(rèn)證結(jié)果是采用下列方法得出的:
HA1=MD5(username:realm:password) HA2=MD5(method:digestURI) response=MD5(HA1:nonce:HA2)后來,RFC 2617引入一些可選的增強(qiáng)安全的方法代替了RFC 2069,這些增強(qiáng)的方法包括質(zhì)量保護(hù)(QOP),客戶端自增加計(jì)數(shù)器和客戶端生成的隨機(jī)數(shù)。這些可選參數(shù)提高了摘要認(rèn)證的安全性,如可防止明文***。
如果算法指令是“MD5”或者未指定,HA1算法如下:
HA1=MD5(username:realm:password)如果算法指令是“MD5-sess”,HA1算法
HA1=MD5(MD5(username:realm:password):nonce:cnonce)如果質(zhì)量保護(hù)指令是“auth”或未指定,HA2算法是
HA2=MD5(method:digestURI)如果質(zhì)量保護(hù)指定是“auth-int”,HA2算法是
HA2=MD5(method:digestURI:MD5(entityBody))如果質(zhì)量保護(hù)指定是“auth”或者“auth-int”,響應(yīng)結(jié)果算法是
response=MD5(HA1:nonce:nonceCount:cnonce:qop:HA2)如果質(zhì)量保護(hù)指令未指定,響應(yīng)結(jié)果算法是
response=MD5(HA1:nonce:HA2)3. MD5安全問題對(duì)摘要認(rèn)證的影響
雖然MD5是可逆的,被認(rèn)為是不安全的,但是在HTTP摘要認(rèn)證過程中使用MD5算法中引入了一些隨機(jī)數(shù),使得數(shù)據(jù)的可逆性的難度大大提高,所以使用MD5是安全的。但如果用戶的密碼過于簡單,通過字典或排序查找算法破解難度就大大降低了,因此不建議使用過于簡單的密碼。
RFC2617 的安全增強(qiáng)的主要方式:
發(fā)起請(qǐng)求的時(shí)候,服務(wù)器會(huì)生成一個(gè)密碼隨機(jī)數(shù)(nonce)(而這個(gè)隨機(jī)數(shù)只有每次"401"相應(yīng)后才會(huì)更新),為了防止***者可以簡單的使用同樣的認(rèn)證信息發(fā)起老的請(qǐng)求,于是,在后續(xù)的請(qǐng)求中就有一個(gè)隨機(jī)數(shù)計(jì)數(shù)器(cnonce),而且每次請(qǐng)求必須必前一次使用的打.這樣,服務(wù)器每次生成新的隨機(jī)數(shù)都會(huì)記錄下來,計(jì)數(shù)器增加.在RESPONSE 碼中我們可以看出計(jì)數(shù)器的值會(huì)導(dǎo)致不同的值,這樣就可以拒絕掉任何錯(cuò)誤的請(qǐng)求.
4. 摘要認(rèn)證流程
客戶端請(qǐng)求一個(gè)需要認(rèn)證的頁面,但是不提供用戶名和密碼。
服務(wù)器返回401?"Unauthorized" 響應(yīng)代碼,并提供認(rèn)證域(realm),以及一個(gè)隨機(jī)生成的、只使用一次的數(shù)值,稱為密碼隨機(jī)數(shù) nonce。
瀏覽器會(huì)向用戶提示認(rèn)證域(realm)(通常是所訪問的計(jì)算機(jī)或系統(tǒng)的描述),并且提示用戶名和密碼。
一旦提供了用戶名和密碼,客戶端會(huì)重新發(fā)送同樣的請(qǐng)求,但是添加了一個(gè)認(rèn)證頭包括了響應(yīng)代碼。
服務(wù)器接受了認(rèn)證并且返回了請(qǐng)求頁面。如果用戶名非法和/或密碼不正確,服務(wù)器將返回"401"響應(yīng)代碼,然后客戶端會(huì)再次提示用戶輸入用戶名及密碼。
5.一段摘要加密報(bào)文示例
有興趣的用戶可以根據(jù)摘要加密算法進(jìn)行計(jì)算。
Authorization:? Digest?username="admin", ? ? //用戶名 realm="favourite?digest?realm", ? //用戶認(rèn)證提示 nonce="1478047635099:8f32add4b6aaef23649ca330b25c64be", ?//隨機(jī)數(shù) uri="/hello", ?//請(qǐng)求地址 response="778110c2b5d0215e0d7640a6baa069a0", ? //加密后的值 opaque="B2E49B2542089EE534695CA7742FB588", ? qop=auth, ? //質(zhì)量保護(hù) nc=00000001, ? //客戶端自增加隨機(jī)數(shù)計(jì)數(shù)器 cnonce="8664dcaabed7e083" //客戶端的隨機(jī)數(shù) |
HA1=MD5("admin:favourite?digest?realm:password");
HA2=MD5("GET:"+uri);
response =?MD5(HA1:nonce:nc:cnonce:qop:HA2)
轉(zhuǎn)載于:https://blog.51cto.com/favccxx/1878505
總結(jié)
- 上一篇: [AtCoder-ARC073F]Man
- 下一篇: php-对银行卡号做掩码处理