標籤:base echo 示範 資料 base64 時間 har use cti
一. HTTP Basic
用戶端以“ : ”串連使用者名稱和密碼後,再經BASE64加密通過Authorization要求標頭發送該密文至服務端進行驗證,每次請求都需要重複發送該密文。可見Basic認證過程簡單,安全性也低,存在泄露個人帳號資訊以及其他諸多安全問題。以下僅為原理示範,不代表真實情況:
- 用戶端向伺服器請求資料:
GET / HTTP/1.1
Host: www.myrealm.com
- 服務端向用戶端發送驗證請求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
- 用戶端收到401傳回值後,將自動彈出一個登入視窗,等待使用者輸入使用者名稱和密碼
- 將“使用者名稱:密碼”進行BASE64加密後發送服務端進行驗證:
GET / HTTP/1.1
Host: www.myrealm.com
Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx
- 服務端取出Authorization要求標頭資訊進行解密,並與使用者資料庫進行對比判斷是否合法,合法將返回200 OK,至於是否發送Authentication-Info頭部則是可選的
1 <?php 2 if (!isset($_SERVER[‘PHP_AUTH_USER‘])) { 3 header(‘WWW-Authenticate: Basic realm="My Realm"‘); 4 header(‘HTTP/1.0 401 Unauthorized‘); 5 echo ‘Text to send if user hits Cancel button‘; 6 exit; 7 } else { 8 echo "<p>Hello {$_SERVER[‘PHP_AUTH_USER‘]}.</p>"; 9 echo "<p>You entered {$_SERVER[‘PHP_AUTH_PW‘]} as your password.</p>";10 }
二. Digest 認證
Digest認證試圖解決Basic認證的諸多缺陷而設計,使用者密碼在整個認證過程中是個關鍵性要素。
下為服務端發送的Digest認證頭部執行個體及各欄位含義說明:PHP官方文檔中發送WWW-Authenticate頭部時各欄位之間用了空格,在Chrome下是不會彈出認證對話方塊的,應該換成”, “或”,“
WWW-Authenticate:Digest realm="Restricted area", qop="auth,auth-int", nonce="58e8e52922398", opaque="cdce8a5c95a1427d74df7acbf41c9ce0", algorithm="MD5"
- WWW-Authenticate:服務端發送的認證頭部
- qop:品質保證,在摘要質詢中用來告知用戶端服務端支援的認證演算法列表;在響應中其值可為auth或auth-int,auth-int包含對實體主體做完整性校正,qop未定義則預設為auth
- nonce:服務端產生的一次性隨機數,用於服務端對用戶端的確認,防止重放攻擊。RFC2617建議採用這個隨機數計算公式:nonce = BASE64(time-stamp MD5(time-stamp “:” ETag “:” private-key)),服務端可以決定這種nonce時間有效性,ETag(URL的Entity Tag,在cgi編程中通常需要自行產生ETag和鑒別,用於標示URL對象是否改變,區分不同語言、Session、Cookie等)可以防止對已更新資源版本(未更新無效,故需要考慮時間新鮮度)的重放請求,private-key為服務端私人
- opaque:這是一個不透明的(不讓外人知道其意義)資料字串,在盤問中發送給用戶端,用戶端會將這個資料字串再發送回服務端器。如果需要在服務端和用戶端之間維護一些狀態,可以用這個參數傳送狀態給用戶端。
- algorithm:摘要演算法,目前支援只MD5
下為用戶端發送的Digest認證頭部執行個體及各欄位含義說明:
Authorization:Digest username="somename", realm="Restricted area", nonce="58e8e52922398", uri="/t.php", response="9c839dde909d270bc5b901c7f80f77d5", opaque="cdce8a5c95a1427d74df7acbf41c9ce0", qop="auth", nc=00000001, cnonce="9c30405c3a67a259"
- cnonce:用戶端產生的一次性隨機數,用於用戶端對伺服器的確認
- nc:讓服務端能夠通過維護請求次數,檢測到重複請求。如果相同的nc出現在兩次請求中,那麼這兩次請求即為重複請求。所以對於防止重放攻擊而言,除了nonce之外,nc才是最後的保證
- Authorization-Info:(略,此處包含nextnonce、rspauth響應摘要等)
下為演算法說明:
- H(v1) = MD5(v1),將v1進行MD5編碼
- KD(v1, v2) = MD5(v1 : v2),將v1和v2用冒號”:”串連後進行MD5編碼
- A1表示包含安全資訊的資料區塊,A1=(user):(realm):(password)
- QoP(保護品質),對不包含安全資訊的資料設定保護方式,可選項:auth、auth-int
- A2表示不包含安全資訊的資料區塊,根據qop值確定:
a) QoP=auth或undefined時,A2=(request-method) : (uri-directive-value)b) QoP=auth-int時,A2=(request-method) : (uri-directive-value) : H((entity-body))
- 老摘要演算法:相容RFC2069,在沒有qop選項時使用
KD(H(A1), (nonce) : H(A2))= MD5(MD5(A1) : (nonce) : MD5(A2))= MD5(MD5((user) : (realm) : (password)) : (nonce) : MD5((request-method) : (uri-directive-value)))
新摘要演算法:新摘要演算法為推薦方式,包含了對隨機數計算和對稱認證的支援。只要qop為auth或auth-int,就要使用這種方式
KD(H(A1), (nonce) : (nc) : (cnonce) : (qop) : H(A2))= MD5(MD5(A1) : (nonce) : (nc) : (cnonce) : (qop) : MD5(A2))= MD5(MD5((user) : (realm) : (password)) : (nonce) : (nc) : (cnonce) : (qop) : MD5((request-method) : (uri-directive-value) : MD5((entity-body))))
WEB認證模式:Basic & Digest