1.何為認證
計算機本身無法判斷坐在顯示器前的使用者的身份。為確認訪問者是否真的具有訪問系統的權限,就需要核對“登錄者本人才知道的信息”、“登錄者本人才會有的信息"。
核對的信息通常是指以下這些。
a.密碼:只有本人才會知道的字符串信息。
b.動態令牌:僅限本人持有的設備內顯示的一次性密碼。
c.數字證書:僅限本人(終端)持有的信息。
d.生物認證:指紋和虹膜等本人的生理信息。
e.IC 卡等:僅限本人持有的信息。
2.HTTP 使用的認證方式
2.1 BASIC認證
步驟 1: 當請求的資源需要 BASIC 認證時,服務器會隨狀態碼 401 Authorization Required,返回帶 WWW-Authenticate 首部字段的響應。該字段內包含認證的方式(BASIC) 及 Request-URI 安全域字符串(realm)。
步驟 2: 接收到狀態碼 401 的客戶端為了通過 BASIC 認證,需要將用戶 ID 及密碼發送給服務器。發送的字符串內容是由用戶 ID 和密碼構成,兩者中間以冒號(:)連接后,再經過 Base64 編碼處理。
假設用戶 ID 為 guest,密碼是 guest,連接起來就會形成 guest:guest 這樣的字符串。然后經過 Base64 編碼,最后的結果即是 Z3Vlc3Q6Z3Vlc3Q=。把這串字符串寫入首部字段 Authorization 后,發送請求。
步驟 3: 接收到包含首部字段 Authorization 請求的服務器,會對認證信息的正確性進行驗證。如驗證通過,則返回一條包含 Request-URI 資源的響應。
2.2 DIGEST認證
步驟 1: 請求需認證的資源時,服務器會隨著狀態碼 401 Authorization Required,返 回帶 WWW-Authenticate 首部字段的響應。該字段內包含質問響應方式認證所需的臨時質詢碼(隨機數,nonce)。
首部字段 WWW-Authenticate 內必須包含 realm 和 nonce 這兩個字段的信息。客戶端就是依靠向服務器回送這兩個值進行認證的。
nonce 是一種每次隨返回的 401 響應生成的任意隨機字符串。該字符串通常推薦由 Base64 編碼的十六進制數的組成形式,但實際內容依賴服務器的具體實現。
步驟 2: 接收到 401 狀態碼的客戶端,返回的響應中包含 DIGEST 認證必須的首部字段 Authorization 信息。
首部字段 Authorization 內必須包含 username、realm、nonce、uri 和 response 的字段信息。其中,realm 和 nonce 就是之前從服務器接收到的響應中的字段。
username 是 realm 限定范圍內可進行認證的用戶名。
uri(digest-uri)即 Request-URI 的值,但考慮到經代理轉發后 Request-URI 的值可能被修改,因此事先會復制一份副本保存在 uri 內。
response 也可叫做 Request-Digest,存放經過 MD5 運算后的密碼字符串,形成響應碼。
步驟 3: 接收到包含首部字段 Authorization 請求的服務器,會確認認證信息的正確性。認證通過后則返回包含 Request-URI 資源的響應。
2.3 SSL客戶端認證
步驟 1: 接收到需要認證資源的請求,服務器會發送 Certificate Request 報文,要求客戶端提供客戶端證書。
步驟 2: 用戶選擇將發送的客戶端證書后,客戶端會把客戶端證書信息以 Client Certificate 報文方式發送給服務器。
步驟 3: 服務器驗證客戶端證書驗證通過后方可領取證書內客戶端的公開密鑰,然后開始 HTTPS 加密通信。
2.4 基于表單認證
步驟 1: 客戶端把用戶 ID 和密碼等登錄信息放入報文的實體部分,通常是以 POST 方法把請求發送給服務器。而這時,會使用 HTTPS 通信來進行 HTML 表單畫面的顯示和用戶輸入數據的發送。
步驟 2: 服務器會發放用以識別用戶的 Session ID。通過驗證從客戶端發送過來的登錄信息進行身份認證,然后把用戶的認證狀態與 Session ID 綁定后記錄在服務器端。
向客戶端返回響應時,會在首部字段 Set-Cookie 內寫入 Session ID(如 PHPSESSID=028a8c…)。
你可以把 Session ID 想象成一種用以區分不同用戶的等位號。
然而,如果 Session ID 被第三方盜走,對方就可以偽裝成你的身份進行惡意操作了。因此必須防止 Session ID 被盜,或被猜出。為了做到這點,Session ID 應使用難以推測的字符串,且服務器端也需要進行有效期的管理,保證其安全性。
另外,為減輕跨站腳本攻擊(XSS)造成的損失,建議事先在 Cookie 內加上 httponly 屬性。
步驟 3: 客戶端接收到從服務器端發來的 Session ID 后,會將其作為 Cookie 保存在本地。下次向服務器發送請求時,瀏覽器會自動發送 Cookie,所以 Session ID 也隨之發送到服務器。服務器端可通過驗證接收到的 Session ID 識別用戶和其認證狀態。