計算機網路-7-4鑑別
鑑別
鑑別(authentication)是要驗證通訊的對方確認是自己所要進行通訊的物件,而不是其他的冒充者,並且所傳送的報文是完整的,沒有被他人篡改過。
鑑別與授權是不同的,授權涉及的問題是:所進行的過程是否被允許(例如是否對某一個檔案能夠進行讀或者寫)。
鑑別可以分為
- 報文鑑別:鑑別所收到的報文的確是報文的傳送者傳送的,而不是其他人偽造篡改的。這裡包含端點鑑別和保溫完整性鑑別。
- 實體鑑別:僅僅鑑別傳送報文的實體,實體可以是一個人,也可以是一個程序。這就是端點鑑別。
報文鑑別
密碼雜湊函式
理論上來講,使用數字簽名簽名就可以實現對報文的鑑別,然而這種方法有一個很大的缺點,就是對較長的報文進行數字簽名會使計算機增加非常大的CPU時間。因此我們需要使用一種相對簡單的方法對報文進行鑑別。這種方法就是使用密碼雜湊函式(cryptographic hash function)
雜湊函式具有如下兩個特點:
- 雜湊函式的輸入長度可以很長,但其輸出長度則是固定的,並且較短。雜湊函式的輸出叫做雜湊值,或更簡單些,稱為雜湊。
- 不同的雜湊值肯定對應於不同的輸入,但不同的輸入卻可能得出相同的雜湊值。這就是說,雜湊函式的輸入和輸出並非一一對應的,而是多對一的。
雜湊函式又稱之為密碼雜湊函式,其最重要的特點是:要找到兩個不同的報文,它們具有同樣的密碼雜湊函式輸出,在計算上是不可行的。也就是說,密碼雜湊函式實際上是一種單項函式(one way function)。如下圖7.6
也就是說,如果我們固定長度的雜湊\(H(X)\)被網路攔截了,那麼截獲者也無法偽造出另一個明文Y,使得\(H(Y)=H(X)\)
實用的密碼雜湊函式MD5和SHA-1
通過許多學者的不斷努力,已經設計出一些實用的密碼雜湊函式(或稱為雜湊演算法),其中最出名的就是 MD5 和 SHA-1。MD 就是 Message Digest 的縮寫,意思是報文摘要。MD5 是報文摘要的第5個版本。
MD5演算法實現大致如下:
- 先把任意長的報文按模\(2^64\)計算其餘數(64位),追加在報文後面。
- 在報文和餘數之間填充1-512位,使得填充後的總長度是512的整數倍。填充的首位是1,後面是0。
- 把追加和填充後的報文分割為512位的資料塊,每個512位的資料塊再分成4個128位的資料庫再依次送到不同的雜湊函式
這樣得出的 MD5 報文摘要程式碼中的每一位都與原來報文中的每一位有關。由此可見,像MD5這樣的密碼雜湊函式實際上已是個相當複雜的演算法,而不是簡單的函數了。
SHA-1演算法實現如下:
SHA是由美國標準與技術協會NIST提出的一個雜湊算法系列。SHA和MD5相似,但碼長為160位(比MD5 的 128 位多了 25%)。SHA 也是用 512 位長的資料塊經過複雜運算得出的。SHA比MD5更安全,但計算起來卻比MD5要慢些。1995年釋出的新版本SHA-1[RFC 3174]在安全性方面有了很大的改進,但後來 SHA-1 也被證明其實際安全性並未達到設計要求,並且也曾被王小云教授的研究團隊攻破。雖然現在 SHA-1 仍在使用,但很快就會被另外的兩個版本SHA-2和SHA-3[W-SHA3]所替代。例如,微軟選擇棄用SHA-1的計
報文鑑別碼
下面進一步討論在報文鑑別中怎麼使用雜湊函式
- 使用者A首先根據自己的明文X計算出雜湊\(H(X)\)(例如,使用MD5)。為方便起見,我們把得出的雜湊H(X)記為H。
- 使用者A把雜湊H拼接在明文X後面,生成了擴充套件的報文(X,H),然後傳送給B。
- 使用者B收到了這個擴充套件的報文(X, H)。因為雜湊的長度H是早已知道的固定值,因此可以把收到的雜湊H和明文X分離開。B通過雜湊函式的運算,計算出收到的明文X的雜湊H(X)。若H(X)=H,則B似乎可以相信所收到的明文是A傳送過來的。
像上面的做法,實際上是不可行的。設想某個入侵者建立了一個偽造的報文M,然後也同樣地計算出其雜湊 H(M),並且冒充A把拼接有雜湊的擴充套件報文傳送給B。B收到擴充套件的報文(M, H(M))後,按照上面步驟(3)的方法進行驗證,發現一切都是正常的,就會誤
認為所收到的偽造報文就是A傳送的。
因此,必須設法對上述的攻擊進行防範。解決的辦法並不複雜,就是對雜湊進行一次加密。圖7-7給出了這種辦法的示意圖。
從圖 7-7可以看出,在 A 從報文 X匯出雜湊 H 後,就對雜湊 H 用金鑰 K加密。這樣得出的結果叫做報文鑑別碼 MAC (Message Authentication Code)。請注意:區域網中使用的媒體接入控制 MAC 也是使用這三個字母,因此在看到MAC 時應注意上下文。
A 把已加密的報文鑑別碼 MAC 拼接在報文 X的後面,得到擴充套件的報文,傳送給 B。
B 收到擴充套件的報文後,先把報文鑑別碼 MAC 與報文 X分離出來。然後用同樣的金鑰 K對收到的報文鑑別碼 MAC 進行解密運算,得出加密前的雜湊H。再把報文 X進行雜湊函式運算,得出雜湊H(X)。最後,把計算出的雜湊H(X)與H進行比較。如一致,就可以相信所收到的報文 X 的確是 A 傳送的。由於入侵者不掌握金鑰 K,所以入侵者無法偽造 A 的報文鑑別碼 MAC,因而無法偽造A傳送的報文。這樣就完成了對報文的鑑別。
我們可以注意到,現在整個的報文是不需要加密的。雖然從雜湊 H 匯出報文鑑別碼MAC 需要加密演算法,但由於雜湊H的長度通常都遠遠小於報文X的長度,因此這種加密不會消耗很多的計算資源。這樣,使用鑑別碼 MAC 就能夠很方便地保護報文的完整性。
現在已經有好幾個不同的MAC標準,而使用最廣泛的是HMAC,它和MD5、SHA-1一起使用。
實體鑑別
實體鑑別與報文鑑別不同,報文鑑別是對每一個收到的報文都要鑑別報文的傳送者,而實體鑑別是在系統接入的持續時間內對和自己通訊的對方實體只需驗證一次。
最簡單的實體鑑別過程如圖 7-8 所示。A 向遠端的 B 傳送帶有自己身份 A(例如,A 的姓名)和口令的報文,並且使用雙方約定好的共享對稱金鑰 KAB進行加密。B 收到此報文後,用共享對稱金鑰 KAB進行解密,從而鑑別了實體A的身份。
然而這種簡單的鑑別方法具有明顯的漏洞。例如,入侵者C可以從網路上截獲A發給B的報文,C並不需要破譯這個報文(因為這可能得花很長時間),而是直接把這個由 A 加密的報文傳送給B,使B誤認為C就是A;然後B就向偽裝成A的C傳送許多本來應當發給A的報文。這就叫做重放攻擊(replay attack)。C甚至還可以截獲A的IP地址,然後把A的IP地址冒充為自己的IP地址(這叫做 IP 欺騙),使B更加容易受騙。
為了對付重放攻擊,可以使用不重數(nonce)。不重數就是一個不重複使用的大隨機數,即“一次一數”。在鑑別過程中不重數可以使 B 能夠把重複的鑑別請求和新的鑑別請求區分開。圖7-9給出了這個過程。
在圖 7-9 中,A首先用明文傳送其身份A和一個不重數R給B。接著,B響應A的查問,用共享的金鑰\(K){AB}\)對\(R_A\)加密後發回給A,同時也給出了自己的不重數\(R_B\)。最後,A再響應B的查問,用共享的金鑰\(K_{AB}\)對\(R_B\)加密後發回給B。這裡很重要的一點是A和B對不同的會話必須使用不同的不重數集。由於不重數不能重複使用,所以C在進行重放攻擊時無法重複使用所截獲的不重數。
在使用公鑰密碼體制時,可以對不重數進行簽名鑑別。例如在圖7-9中,B用其私鑰對不重數\(R_A\)進行簽名後發回給A。A用B的公鑰核實簽名,如能得出自己原來發送的不重數\(R_A\),就核實了和自己通訊的對方的確是B。同樣,A也用自己的私鑰對不重數 \(R_B\)進行簽名後傳送給B。B用A的公鑰核實簽名,鑑別了A的身份。
中間人攻擊:
如圖7-10
從圖7-10可看出,A想和B通訊,向B傳送“我是A”的報文,並給出了自己的身份。這個報文被“中間人”C截獲,C把這個報文原封不動地轉發給B。B選擇一個不重數\(R_B\)傳送給A,但同樣被C截獲後也照樣轉發給A。
中間人C用自己的私鑰\(SK_C\)對\(R_B\)加密後發回給B,使B誤以為是A發來的。A收到RB後也用自己的私鑰\(SK_A\)對 RB加密後發回給B,但中途被C截獲並丟棄。B向A索取其公鑰,這個報文被C截獲後轉發給A。
C把自己的公鑰\(PK_C\)冒充是A的公鑰傳送給B,而C也截獲到A傳送給B的公鑰\(PK_A\)。
B用收到的公鑰\(PK_C\)(以為是A的)對資料DATA加密,併發送給A。C截獲後用自己的私鑰\(SK_C\)解密,複製一份留下,然後再用A的公鑰\(PK_A\)對資料DATA加密後傳送給A。A收到資料後,用自己的私鑰\(SK\)解密,以為和B進行了保密通訊。其實,B傳送給A的加密資料已被中間人C截獲並解密了一份,但A和B都不知道。