張鑫燕,葉 猛
(1.光纖通信技術與網絡國家重點實驗室,湖北 武漢 430074;2.武漢郵電科學研究院,湖北 武漢 430074;3.武漢虹旭信息技術有限責任公司安全產品部,湖北 武漢 430074)
在過去10年中,基于計算機網絡的信息獲取模式已經逐步取代傳統模式被人們廣泛應用,企業之間的信息交互也更多地依賴于計算機網絡。各種網絡增值服務和應用的使用率很大程度上取決于它們所能提供的服務安全,信息安全已成為人們評估各項網絡服務的重要指標之一,成為互聯網通信急需解決的問題之一。由Netscape公司提出的工作在傳輸層之上的安全套階層協議SSL[1],可以在客戶端和服務器端之間建立一條安全通道,保證通信不被竊聽,并且始終對服務器進行認證,將傳送的數據進行加密和隱藏,有效提高了應用程序之間數據的安全性,已成為事實上的標準。SSL分為兩層,高層是SSL握手協議,允許通信雙方在應用協議傳輸和接收第1個數據字節前彼此之間相互認證、協商加密算法、生成密鑰等。低層是SSL記錄協議層,由更高的層次那里接收需要傳輸的任意長度的應用報文,將接收到的信息分段成可管理的塊,進行數據壓縮、數據認證和加密等操作。
SSL協議可以為應用層通信提供獨立的安全通道,包括身份驗證、消息完整性和信息加密。其中后兩者是由記錄層提供的。信息加密性是指記錄層協議會使用算法利用握手協議中提供的安全參數產生各種密鑰,利用這些密鑰將客戶機和服務器之間傳送的數據進行加密處理(DES、RC4等),對稱加密所產生的密鑰對每個連接都是唯一的[2],網絡中的非法竊聽者所獲取的信息都將是無意義的密文信息,記錄協議也支持非加密傳輸,機密性的實現在本章不做討論。消息完整性服務是指通過特定的算法利用數據的原始信息計算出標識信息的特征值,此特征值在接收端通過驗證說明消息沒有遭到第三方篡改和破壞。
MAC算法利用摘要算法,計算MAC的初始元素是消息的原始信息,消息被第三方修改后此信息會發生變化而不能生成相同的MAC。MAC傳送時還需要依賴密鑰,發送方發送數據時使用共享密鑰對信息進行加密,添加一個也是基于該密鑰構造的MAC,這樣保證了接收方的身份,因為只有真正的接收方才與其共享解密時需要的密鑰。而接收方也能確認發送方的身份,因為只有發送方才具有創建消息上的MAC時所需要的密鑰,這樣就可以保證消息的完整性。過程如圖1所示。

圖1 消息完整性原理圖
記錄層所處理的數據主要是來自其上層協議握手層,握手層中的數據主要是身份驗證數據,確定密鑰參數和加密算法的數據以及其所承載的應用數據。記錄層將數據進行SSL明文分段、SSL壓縮、SSL密文這些步驟生成一系列的SSL數據段,每一個SSL數據段均是被單獨保護且具有驗證消息完整性功能的數據包。記錄協議的操作過程如圖2所示。

圖2 記錄協議的操作過程
分段是指將數據進行分塊,每塊最大長度為214byte,對于上層握手協議的數據包,因為其長度都沒有超出需要分段的最大長度故不需要分段。壓縮處理在記錄層協議中是可選的,若沒有定義壓縮算法可以不壓縮。壓縮必須是無損的,并且不能使內容的長度大于1024 byte。
記錄協議從高層SSL收到傳輸片段之前,根據經過壓縮的數據片段計算出MAC值,并與數據連結在一起。通過在壓縮數據上計算消息認證MAC可以進行信息完整性檢查,以驗證其消息是否遭到攻擊。
加密的過程用于提供消息的機密性,對壓縮數據和MAC進行加密,SSL記錄層協議也支持明文傳輸,添加記錄頭生成記錄數據。
經過處理后的SSL數據段由記錄頭和長度不為0的記錄數據組成的,結構體如圖3所示。其中記錄頭包含了內容類型、協議版本號、長度。長度字段標識了記錄的長度,接收方每次只取固定長度的消息,雙方使用的版本磋商依靠版本號來進行。SSL需要在同一條受保護的通道中傳輸控制信息與用戶數據,由內容類型來進行區分[3]。每一條記錄數據段中共有3種類型的數據,即用于驗證消息完整性的MAC數據、具有用戶意圖的應用數據和粘貼在尾部的填充數據。實際數據即為壓縮后的用戶數據和粘貼數據是一種填充數據,指在實際數據的尾部添加0數據,以保證數據長度是數據塊長度的整數倍,MAC數據將會在下面進行詳細介紹。

圖3 保證消息完整性的數據結構
記錄層接收到并為其服務的數據是它的上層協議握手層中的數據,所有初始的握手協議報文在傳送時都是未保護的,在協商完成之后,會建立一條新的連接來傳輸應用數據,此連接將以客戶端發出的一個報文Finished為開始。此數據包若被篡改和攻擊,會影響整條應用數據流的安全性,因此必須對它添加一個標識身份的報文識別碼(MAC),這個MAC是通過對握手過程中產生的所有被主密鑰加密后的協商包計算得出的。只有在驗證了Finished數據中的MAC數據之后,通信雙方才真正開始傳輸應用層上的數據。除了Finished數據,必須保證代表用戶真正意圖的應用層的數據的消息完整性。因此MAC算法針對的是握手連接建立之后客戶端傳送的第一個Finished數據包,以及之后通信雙方傳送的應用數據包[4]。
消息完整性算法的實現需要計算出能唯一表征此消息的特征值,利用傳輸數據計算出的MAC就是針對此功能,對于MAC算法的設計有兩點要求,第一是不可由特征值推算出原始數據,即要求MAC算法具有不可逆性。其次,不同的消息要可以生成不同的MAC,這樣可以防止有消息竊聽者將原始消息進行替換,即要求算法具有抗沖突性。這正是散列算法的特性,因此SSL采用的MAC算法一般是基于MD5或SHA的散列算法,這里詳細介紹基于MD5算法的設計原理。
MD5散列算法的輸入是長度為512位的數據分組[5],不同長度的消息在計算時需要確保分組各不相同,因此最后一個分組是由消息、填充字節以及一個64位的消息長度構成的。每一組又被劃分為16個32位子分組,其輸出是4個32位字的級聯生成的128位散列值。
胡四一:《意見》共分5章20條,明確提出了實行最嚴格水資源管理制度的指導思想、基本原則、目標任務、管理措施和保障措施。主要內容概括來說,就是確定“三條紅線”,實施“四項制度”。
MD5算法共有4輪,每一步都加入了前一步的結果且有唯一的加法常數,雖然MD5相較于MD4[6]算法更為復雜,運算速度相對要慢一點,但因為在抗分析安全性上的出色表現已經基本取代了MD4。MD5算法中主循環共4輪,而循環的次數由長度為512位的消息分組個數決定,4輪主循環中分別用到了下列非線性函數程序:

這4個非線性函數對進入主循環的16個32位分組進行4輪變換,具體操作如下:首先分別將每個512位的分組輸入分割成4個鏈接變量(A,B,C,D),并創造一份這4個鏈接變量的副本(a,b,c,d),將4個副本中的3個經K,M,N,I非線性函數運算后的結果與第4個副本相加,再加上一個32位的加法常數,將相加得出的最終結果循環左移若干位,再任取a,b,c,d中任意一個與此值相加,即可返回更新A,B,C,D的數值,這樣便進行了一次循環。
MD5中所用的32位加法常數靠創建一張i取值為1~64的表H[i]來定義,再取i的正弦絕對值,并對其做4294967296次方運算,得出的整數部分就是H[i],在變換中對i進行冪運算和正弦運算可以更好地消除MD5變換中的線性性[7]。
運算完所有的分組后即輸出MD5算法的散列結果,將A,B,C,D進行級聯運算后得到的就是最終結果。下面展示部分MD5算法結果的例子:

MD5散列函數的輸入消息長度為512位,生成的固定長度的散列特征值為128位,從而使得幾乎不可能存在函數的逆。
MD5散列函數的抗沖突性強度與生成的摘要值長度有關,一個64位的摘要值抗沖突的強度為32位,即128次操作里才可能出現一次沖突。因此兩條不同消息能產生相同摘要值的概率是非常低的。
握手層數據中客戶端發出的Finished消息能確認握手過程的真實性,確認握手消息是否有被任何攻擊者修改過,是第一條使用最新協商出的一組密鑰加密實現自我保護的消息。且Finished消息也是第一條進行MAC計算的消息,該MAC算法與應用層數據的MAC算法相同。如圖4所示,該算法采用兩輪MD5散列算法,第一輪調用MD5的輸入就是將所有握手消息、Sender常量、主密碼以及一些填充字節進行組合。第二遍調用MD5的輸入為主密碼、一些填充字節以及第一次MD5計算輸出的組合。Sender常量可以確保通信雙方產生的Finished消息不會重復,避免第三方重發Finished消息的攻擊[8]。

圖4 Finished消息的算法
以MD5為基礎的算法中pad_1和pad_2是兩個數組,pad_1數組是由固定元素0x36填充,pad_2數組是由固定元素0x5c填充,且數組的長度為16 byte,由于MD5的分組長度為64 byte,所以1個16 byte的密鑰就意味著需要48 byte的填充,即pad_1和pad_2的填充長度均為48 byte。使用填充的目的是確保MAC密鑰與填充加在一起可以充滿消息摘要第一塊的整塊空間[9]。
MAC實現總體方案是將用戶的壓縮數據進行散列(Hash)計算,具體選擇哪種Hash算法是通過握手協議中選擇的套件來決定的,由圖5可看出一共經歷了2輪Hash算法。參與計算的元素有密鑰、pad_1、pad_2、內容類型、包長度、數據包以及seq_num組成。

圖5 MAC算法的實現
MAC_secret_key分為 Client_write_MAC_secret和Server_write_MAC_secret,它們的使用者身份不同,客戶端發送的數據進行MAC計算時會用到的key是Client_write_MAC_secret,服務器發送數據進行MAC運算時用到的key是Server_write_MAC_secret。若想有效地利用MAC算法驗證消息完整性,必須保證密鑰不被竊取和篡改。
seq_num是一個64位的序號,序號是一個可以被發送和接收雙方遞增的計數器,計算器可以循環使用且初始值全為0,即客戶端與服務器所發送的第一條消息的序號為0。記錄層協議需要計算MAC值的第一條消息是握手層數據中客戶端發出的Finished消息,此時序號為初始值全0,之后數據每進行一次MAC計算,此序號的值就會一次遞增,這樣每個經過MAC運算的數據包都會按次序分配一個不重復的序列號來標識[8]。
MAC算法需要密鑰的參與,沒有密鑰的非法用戶在改變消息的內容后,無法添加正確的MAC值,MAC值驗證將會失敗,從而保證非法用戶無法隨意修改消息內容。
SSL利用非對稱密鑰算法加密密鑰的方法實現密鑰交換,保證第三方無法獲取該密鑰。如圖6所示,SSL客戶端利用SSL服務器的公鑰加密密鑰,將加密后的密鑰發送給SSL服務器,只有擁有對應私鑰的SSL服務器才能從密文中獲取原始的密鑰。SSL客戶端發送給SSL服務器的密鑰并不能直接用來加密數據或計算MAC值,該密鑰是用來計算對稱密鑰和MAC密鑰的信息,稱為Premaster Secret[10]。SSL客戶端和SSL服務器利用Premaster Secret計算出相同的主密鑰(Mastersecret),再利用Master Secret生成用于對稱密鑰算法、MAC算法等的密鑰。SSL通常采用RSA算法加密傳輸密鑰。

圖6 密鑰交換示意圖
針對消息完整性服務的攻擊有兩種,分別是重放攻擊和再排序攻擊。
重放攻擊指攻擊者獲取敏感有效數據并將它重復發送,通過身份驗證欺騙服務器,以達到劫持會話的目的。對于這種攻擊僅僅使用MAC是無法防御的,因為重復的信息包中MAC是正確的。SSL協議將傳輸的信息進行編號來增加消息的關聯性,在通信過程中,將標示數據包順序的序列號隱藏在生成的MAC中,雙方序列號彼此相互依賴且由通信雙方單獨維護,每一次有新密鑰交換時序列號均進行更新,攻擊者在不能提供合法的序列號進行會話劫持肯定是失敗的。
再排序攻擊指攻擊者交換一條或多條記錄的順序,使用序號可以檢測出這種攻擊,但由于序號并不在記錄中,所以無法對其加以糾正。因此,SSL必須運行于一種能夠提供可靠傳輸的傳輸協議之上。TCP滿足這些要求,基于TCP傳輸的數據可以以任何順序到達,但是可以確保應用看到的是傳輸時的順序,而UDP不是這樣,因此SSL不能成功地在UDP上運行。基于UDP傳輸的任何記錄都有可能順序錯亂或者丟失,這看上去就像針對SSL實施的主動攻擊[11]。
SSL記錄層將握手層協議的數據進行封裝提供消息完整性和不可讀性。記錄層采用的加密算法和MAC算法在握手層中完成協商。記錄層還會為傳送的每一條數據添加一個序列號,用于檢測消息是否遭到丟失或重放。SSL記錄協議還可以在握手層協商好壓縮算法的基礎上進行數據壓縮。采用散列函數和機密共享的方法使SSL協議保證數據完整、準確地到達對端,從而提供了消息完整性服務。
[1]RFC2246,The TLS protocol version 1.0[S].1999.
[2]宋志敏,王衛京,南相浩.SSL V3.0及其安全性分析[J].計算機工程與應用,2000(10):145-147.
[3]SSL Protocol Version 3.03/4/96[EB/OL].[2011-11-13].http://www.snca.com.cn/Upload/200721216458844.doc.
[4]董智鵬.SSL協議的初步研究和應用[J].儀器儀表與分析監測,2010(2):15-20.
[5]RIVEST R L.The MD4 message digest algorithm[C]//Proc.10th Annual International Cryptology Conference on Advances in Cryptology.London:Springer-Verlag,1990:303-311.
[6]RFC 1321,The MD5 message digest algorithm[S].1992.
[7]黎琳.MD4算法分析[J].山東大學學報:理學版,2007(4):42-45.
[8]RESCORLA E.SSL與TLS[M].崔凱,譯.北京:中國電力出版社,2002.
[9]張藝博.OpenSSL源碼的記錄層解析[J].電腦編程技巧與維護,2009(2):48-51.
[10]齊芳,賈維嘉,王國軍.SSL握手協議中客戶端平衡密鑰交換算法[J]. 計算機工程與應用,2007(43):32-36.
[11]趙川,伍瑞卿,樊豐.一種精簡TCP/IP協議棧的設計與實現[J].電視技術,2010,34(9):34-39.