HTTP認證模式:Basic and Digest Access Authentication

一. Basic 認證php

  客戶端以「 : 」鏈接用戶名和密碼後,再經BASE64編碼Base64 Content-Transfer-Encoding )經過Authorization請求頭髮送該密文至服務端進行驗證,每次請求都須要重複發送該密文。可見Basic認證過程簡單,安全性也低,存在泄露我的帳號信息以及其餘諸多安全問題,最好在實現了Transport Layer Security (TLS)的狀況下去使用。如下僅爲原理演示,不表明真實狀況:html

  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。RFC 2617 規格中Basic認證不發送Authentication-Info頭部,Authentication-Info頭部是Digest認證中新增的

  

二. 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:服務端發送的認證質詢頭部
  • Authentication-Info:服務端發送的認證響應頭部,包含nextnonce、rspauth響應摘要等
  • realm:受權域,至少應該包含主機名
  • domain:受權訪問URIs列表,項與項之間以空格符分隔
  • qop:質量保護,值爲auth或auth-int或[token],auth-int包含對實體主體作完整性校驗
  • nonce:服務端產生的隨機數,用於增長摘要生成的複雜性,從而增長破解密碼的難度,防範「中間人」與「惡意服務器」等攻擊類型,這是相對於不使用該指令而言的;另外,nonce自己可用於防止重放攻擊,用於實現服務端對客戶端的認證。RFC 2617 建議採用這個隨機數計算公式:nonce = BASE64(time-stamp MD5(time-stamp 「:」 ETag 「:」 private-key)),服務端能夠決定這種nonce時間有效性,ETag(URL對應的資源Entity Tag,在CGI編程中一般須要自行生成ETag和鑑別,可用於鑑別URL對應的資源是否改變,區分不一樣語言、Session、Cookie等)能夠防止對已更新資源版本(未更新無效,故須要設定nonce有效期)的重放請求,private-key爲服務端私有keydom

  • opaque:這是一個不透明的數據字符串,在盤問中發送給客戶端,客戶端會將這個數據字符串再發送回服務端器。若是須要在服務端和客戶端之間維護一些狀態,用nonce來維護狀態數據是一種更容易也更安全的實現方式
  • stale:nonce過時標誌,值爲true或false
  • algorithm:摘要算法,值爲MD5或MD5-sess或[token],默認爲MD5

  下爲客戶端發送的Digest認證頭請求部實例及各指令含義說明:ui

Authorization: Digest username="somename", realm="Restricted area", nonce="58e8e52922398", uri="/t.php", response="9c839dde909d270bc5b901c7f80f77d5", opaque="cdce8a5c95a1427d74df7acbf41c9ce0", qop="auth", nc=00000001, cnonce="9c30405c3a67a259"
  • cnonce:客戶端產生的隨機數,用於客戶端對服務器的認證。因爲「中間人」與「惡意服務器」等攻擊方式的存在,致使一個特地選擇而非隨機惟一的nonce值傳給客戶端用於摘要的計算成爲可能,使得「選擇性明文攻擊」可能奏效,最後用戶密碼泄露。所以與nonce同樣,cnonce可用於增長摘要生成的複雜性,從而增長破解密碼的難度,也就保證了對服務端的認證
    The countermeasure against this attack(選擇明文攻擊) is for clients to be configured to require the use of the optional "cnonce" directive;this allows the client to vary the input to the hash in a way not chosen by the attacker.

     

  • nc:當服務端開啓qop時,客戶端才須要發送nc(nonce-count)。服務端可以經過維護nc來檢測用當前nonce標記的請求重放。若是相同的nc出如今用當前nonce標記的兩次請求中,那麼這兩次請求即爲重複請求。因此對於防止重放攻擊而言,除了nonce以外,nc纔是最後的保障。所以服務端除了維護用戶帳號信息以外,還須要維護nonce和nc的關聯狀態數據

  下面將就摘要計算方法進行說明: 

  1. 算法的通常性表示
    H(data) = MD5(data)
    KD(secret, data) = H(concat(secret, ":", data))
  2. 與安全信息相關的數據用A1表示,則
    a) 採用MD5算法:
        A1=(user):(realm):(password)
    b) 採用MD5-sess算法:
        A1=H((user):(realm):(password)):nonce:cnonce
  3. 與安全信息無關的數據用A2表示,則
    a) QoP爲auth或未定義:
        A2=(request-method):(uri-directive-value)
    b) QoP爲auth-int:
        A2=(request-method):(uri-directive-value):H((entity-body))
  4. 摘要值用response表示,則
    a) 若qop沒有定義:
        response
        = KD(H(A1),<nonce>:H(A2))
        = H(H(A1),<nonce>:H(A2))
    b) 若qop爲auth或auth-int:
        response
        = KD(H(A1),<nonce>:<nc>:<cnonce>:<qop>:H(A2))
        = H(H(A1),<nonce>:<nc>:<cnonce>:<qop>:H(A2))

     

三. 安全風險

  • 在線字典攻擊(Online dictionary attacks):攻擊者能夠嘗試用包含口令的字典進行模擬計算response,而後與竊聽到的任何nonce / response對進行對比,若結果一致則攻擊成功。爲應對針對弱口令的字典攻擊,下降攻擊成功的可能性,能夠禁止用戶使用弱口令
  • 中間人(Man in the Middle):在一次中間人攻擊中,一個弱認證方案被添加並提供給客戶端,所以你老是應該從多個備選認證方案中選擇使用最強的那一個;甚至中間人可能以Basic認證替換掉服務端提供的Digest認證,從而竊取到用戶的安全憑證,而後中間人可利用該憑證去響應服務端的Digest認證盤問;攻擊者還可能打着免費緩存代理服務的幌子來招攬輕信者,經過實施中間人攻擊,盜取他們的安全憑證;中間代理也可能誘導客戶端來發送一個請求給服務端。爲此,客戶端可考慮給出安全等級風險警示,或在跟蹤服務端的認證配置時發現其認證強度下降就發出警告,或配置成只使用強認證,或從指定站點來完成認證
  • 預先計算字典攻擊(Precomputed dictionary attacks):攻擊者先構建(response, password) 對字典,而後用選擇性明文(nonce)攻擊的辦法來得到相應盤問的response,檢索字典找到匹配的response則攻擊成功
  • 批量式暴力攻擊(Batch brute force attacks):中間人會對多個用戶執行選擇性明文攻擊來蒐集相應的responses,經過控制蒐集的nonce / response對的數量將會縮短找到第一個password的耗時,這種攻擊的應對之策就是要求客戶端使用cnonce指令
  • 假冒服務器欺騙(Spoofing by Counterfeit Servers):對於Basic認證,這種攻擊方式更容易奏效,對於Digest認證則更難,但前提是客戶端必須知道將要使用的是Digest認證。用戶在所使用的認證機制中如何發現這一潛在攻擊樣式應該獲得可見的幫助

相關文章
相關標籤/搜索