http digest鑒權
“摘要”式認證( Digest authentication)是一個簡單的認證機制,最初是為HTTP協議開發的,因而也常叫做HTTP摘要,在RFC2671中描述。其身份驗證機制很簡單,它采用雜湊式(hash)加密方法,以避免用明文傳輸用戶的口令。
摘要認證就是要核實,參與通信的雙方,都知道雙方共享的一個秘密(即口令)。
當服務器想要查證用戶的身份,它產生一個摘要盤問(digest challenge),並發送給用戶。典型的摘要盤問如下:
Digest realm="iptel.org", qop="auth,auth-int",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", opaque="", algorithm=MD5
這裏包括了一組參數,也要發送給用戶。用戶使用這些參數,來產生正確的摘要回答,並發送給服務器。摘要盤問中的各個參數,其意義如下:
realm(領域):領域參數是強制的,在所有的盤問中都必須有。它是目的是鑒別SIP消息中的機密。在SIP實際應用中,它通常設置為SIP代理服務器所負責的域名。
在要求用戶輸入用戶名和口令時,SIP用戶代理則會顯示這個參數的內容給用戶,以便用戶使用正確的用戶名和口令(這個服務器的)。
nonce(現時):這是由服務器規定的數據字符串,在服務器每次產生一個摘要盤問時,這個參數都是不一樣的(與前面所產生的不會雷同)。“現時”通常是由一些數據通過md5雜湊運算構造的。這樣的數據通常包括時間標識和服務器的機密短語。這確保每個“現時”都有一個有限的生命期(也就是過了一些時間後會失效,並且以後再也不會使用),而且是獨一無二的(即任何其它的服務器都不能產生一個相同的“現時”)。
客戶端使用這個“現時”來產生摘要響應(digest response),這樣服務器也會在一個摘要響應中收到“現時”的內容。服務器先要檢查了“現時”的有效性後,才會檢查摘要響應的其它部分。
因而,“現時”在本質上是一種標識符,確保收到的摘要機密,是從某個特定的摘要盤問產生的。還限制了摘要盤問的生命期,防止未來的重播攻擊。
opaque(不透明體):這是一個不透明的(不讓外人知道其意義)數據字符串,在盤問中發送給用戶。
在摘要響應中,用戶會將這個數據字符串發送回給服務器。這使得服務器可以是無狀態的。如果需要在盤問和響應之間維護一些狀態,可以用這個參數傳送狀態給客戶端,此後當摘要響應回來時,再讀這個狀態。
algorithm(算法):這是用來計算雜湊的算法。當前只支持MD5算法。
qop(保護的質量)。這個參數規定服務器支持哪種保護方案。客戶端可以從列表中選擇一個。值
“auth”表示只進行身份查驗, “auth-int”表示進行查驗外,還有一些完整性保護。需要看更詳細的描述,請參閱RFC2617。
在收到了摘要盤問後,如果沒有預先配置,用戶代理軟件通常會提示用戶輸入用戶名和口令,產生一個摘要響應,並將這個響應發送給服務器。例如,摘要響應可能如下:
Digest username="jan", realm="iptel.org",
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", uri="sip:iptel.org",
qop=auth, nc=00000001, cnonce="0a4f113b",
response="6629fae49393a05397450978507c4ef1", opaque=""
摘要響應類似於摘要盤問。相同的參數,則與摘要盤問有相同的意義。這裏只描述新的參數:
uri(統一資源指示符):這個參數包含了客戶端想要訪問的URI。
qop:客戶端選擇的保護方式。
nc:“現時”計數器,這是一個16進制的數值,即客戶端發送出請求的數量(包括當前這個請求),這
些請求都使用了當前請求中這個“現時”值。例如,對一個給定的“現時”值,在響應的第一個請求中,客戶端將發送“nc=00000001”。這個指示值的目的,是讓服務器保持這個計數器的一個副本,以便檢測重復的請求。如果這個相同的值看到了兩次,則這個請求是重復的。
cnonce:這也是一個不透明的字符串值,由客戶端提供,並且客戶端和服務器都會使用,以避免用明文文本。這使得雙方都可以查驗對方的身份,並對消息的完整性提供一些保護。
response(響應):這是由用戶代理軟件計算出的一個字符串,以證明用戶知道口令。
當服務器接收到摘要響應,也要重新計算響應中各參數的值,並利用客戶端提供的參數值,和服務器上存儲的口令,進行比對。如果計算結果與收到的客戶響應值是相同的,則客戶已證明它知道口令,因而客戶的身份驗證通過。
http digest鑒權