WEB認證模式:Basic & Digest

來源:互聯網
上載者:User

標籤:base   echo   示範   資料   base64   時間   har   use   cti   

一. HTTP Basic

  用戶端以“ : ”串連使用者名稱和密碼後,再經BASE64加密通過Authorization要求標頭發送該密文至服務端進行驗證,每次請求都需要重複發送該密文。可見Basic認證過程簡單,安全性也低,存在泄露個人帳號資訊以及其他諸多安全問題。以下僅為原理示範,不代表真實情況:

  1. 用戶端向伺服器請求資料:

    GET / HTTP/1.1
    Host: www.myrealm.com

  2. 服務端向用戶端發送驗證請求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

  3. 用戶端收到401傳回值後,將自動彈出一個登入視窗,等待使用者輸入使用者名稱和密碼
  4. 將“使用者名稱:密碼”進行BASE64加密後發送服務端進行驗證:

    GET / HTTP/1.1
    Host: www.myrealm.com
    Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx

  5. 服務端取出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響應摘要等)

  下為演算法說明: 

  1. H(v1) = MD5(v1),將v1進行MD5編碼
  2. KD(v1, v2) = MD5(v1 : v2),將v1和v2用冒號”:”串連後進行MD5編碼
  3. A1表示包含安全資訊的資料區塊,A1=(user):(realm):(password)
  4. QoP(保護品質),對不包含安全資訊的資料設定保護方式,可選項:auth、auth-int
  5. 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))

     

  6. 老摘要演算法:相容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)))

     

  7. 新摘要演算法:新摘要演算法為推薦方式,包含了對隨機數計算和對稱認證的支援。只要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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.