(1)BASIC 認證(基本認證);
(2)DIGEST 認證(摘要認證);
(3)SSL 客戶端認證;
(4)FormBase 認證(基於表單認證);
1、**BASIC 認證(基本認證)的步驟 **
- host解釋
Http請求頭信息里面會帶有一個Host字段,一個IP地址可以對應多個域名,比如假設我有這么幾個域名www.qiniu.com,www.taobao.com和www.jd.com然后在域名提供商那通過A記錄或者CNAME記錄的方式最終都和我的虛擬機服務器IP 111.111.111.111關聯起來,那么我通過任何一個域名去訪問最終解析到的都是IP 111.111.111.111。
但是還是沒有提到Host的概念,其實可以這樣看,我們的那台虛擬機111.111.111.111上面其實是可以放很很多網站的(不然如果只能放一個網站的話就太不合理了,虛擬機那么多資源都浪費了),我們可以把www.qiniu.com,www.taobao.com和www.jd.com這些網站都假設那台虛擬機上面,但是這樣會有一個問題,我們每次訪問這些域名其實都是解析到服務器IP 111.111.111.111,我怎么來區分每次根據域名顯示出不同的網站的內容呢,其實這就要用到請求頭中Host的概念了,每個Host可以看做是我在服務器111.111.111.111上面的一個站點,每次我用那些域名訪問的時候都是會解析同一個虛擬機沒錯,但是我通過不同的Host可以區分出我是訪問這個虛擬機上的哪個站點。
2、基本認證的優缺點
優點
簡單,被廣泛支持
缺點
不安全
安全分幾個層面:內容的篡改及嗅探。這是HTTP協議本身存在的問題,所以很難根除,以后的網絡世界會慢慢全部轉為使用更加安全的HTTPS的。
1 用戶HTTP是在網絡上裸奔的,所以這個基本認證的用戶名和密碼也是可以被人看到的,雖然它使用了Base64來編碼,但這個編碼很容易就可以解碼出來。
2 即使這個認證內容不能被解碼為原始的用戶名和密碼也是不安全的,惡意用戶可以再獲取了認證內容后使用其不斷的享服務器發起請求,這就是所謂的重放攻擊。
3 像中間人攻擊就更不能防止了,中間人可以修改報文然后請求服務器。
**DIGEST 認證(摘要認證)**
- 相關解釋:
步驟2:
username是realm 限定范圍內可進行認證的用戶名。
uri(digest-uri)即Request-URI的值,但考慮到經代理轉發后Request-URI的值可能被修改因此事先會復制一份副本保存在 uri內。
response 也可叫做 Request-Digest,存放經過 MD5 運算后的密碼字符串,形成響應碼。
步驟 3:接收到包含首部字段 Authorization 請求的服務器,會確認認證信息的正確性。認證通過后則返回包含 Request-URI 資源的響應。並且這時會在首部字段 Authentication-Info 寫入一些認證成功的相關信息。(不過我下面的例子沒有去寫這個Authentication-Info,而是直接返回的數據。因為我實在session里緩存的認證結果)。
- digest認證中相關參數含義
WWW-Authentication:用來定義使用何種方式(Basic、Digest、Bearer等)去進行認證以獲取受保護的資源
realm:表示Web服務器中受保護文檔的安全域(比如公司財務信息域和公司員工信息域),用來指示需要哪個域的用戶名和密碼
qop:保護質量,包含auth(默認的)和auth-int(增加了報文完整性檢測)兩種策略,(可以為空,但是)不推薦為空值
nonce:服務端向客戶端發送質詢時附帶的一個隨機數,這個數會經常發生變化。客戶端計算密碼摘要時將其附加上去,使得多次生成同一用戶的密碼摘要各不相同,用來防止重放攻擊
nc:nonce計數器,是一個16進制的數值,表示同一nonce下客戶端發送出請求的數量。例如,在響應的第一個請求中,客戶端將發送“nc=00000001”。這個指示值的目的是讓服務器保持這個計數器的一個副本,以便檢測重復的請求
cnonce:客戶端隨機數,這是一個不透明的字符串值,由客戶端提供,並且客戶端和服務器都會使用,以避免用明文文本。這使得雙方都可以查驗對方的身份,並對消息的完整性提供一些保護
response:這是由用戶代理軟件計算出的一個字符串,以證明用戶知道口令
Authorization-Info:用於返回一些與授權會話相關的附加信息
nextnonce:下一個服務端隨機數,使客戶端可以預先發送正確的摘要
rspauth:響應摘要,用於客戶端對服務端進行認證
stale:當密碼摘要使用的隨機數過期時,服務器可以返回一個附帶有新隨機數的401響應,並指定stale=true,表示服務器在告知客戶端用新的隨機數來重試,而不再要求用戶重新輸入用戶名和密碼了
**SSL 客戶端認證**