張鑫燕,葉 猛
(1.光纖通信技術(shù)與網(wǎng)絡(luò)國家重點實驗室,湖北 武漢 430074;2.武漢郵電科學(xué)研究院,湖北 武漢 430074;3.武漢虹旭信息技術(shù)有限責(zé)任公司安全產(chǎn)品部,湖北 武漢 430074)
在過去10年中,基于計算機網(wǎng)絡(luò)的信息獲取模式已經(jīng)逐步取代傳統(tǒng)模式被人們廣泛應(yīng)用,企業(yè)之間的信息交互也更多地依賴于計算機網(wǎng)絡(luò)。各種網(wǎng)絡(luò)增值服務(wù)和應(yīng)用的使用率很大程度上取決于它們所能提供的服務(wù)安全,信息安全已成為人們評估各項網(wǎng)絡(luò)服務(wù)的重要指標(biāo)之一,成為互聯(lián)網(wǎng)通信急需解決的問題之一。由Netscape公司提出的工作在傳輸層之上的安全套階層協(xié)議SSL[1],可以在客戶端和服務(wù)器端之間建立一條安全通道,保證通信不被竊聽,并且始終對服務(wù)器進(jìn)行認(rèn)證,將傳送的數(shù)據(jù)進(jìn)行加密和隱藏,有效提高了應(yīng)用程序之間數(shù)據(jù)的安全性,已成為事實上的標(biāo)準(zhǔn)。SSL分為兩層,高層是SSL握手協(xié)議,允許通信雙方在應(yīng)用協(xié)議傳輸和接收第1個數(shù)據(jù)字節(jié)前彼此之間相互認(rèn)證、協(xié)商加密算法、生成密鑰等。低層是SSL記錄協(xié)議層,由更高的層次那里接收需要傳輸?shù)娜我忾L度的應(yīng)用報文,將接收到的信息分段成可管理的塊,進(jìn)行數(shù)據(jù)壓縮、數(shù)據(jù)認(rèn)證和加密等操作。
SSL協(xié)議可以為應(yīng)用層通信提供獨立的安全通道,包括身份驗證、消息完整性和信息加密。其中后兩者是由記錄層提供的。信息加密性是指記錄層協(xié)議會使用算法利用握手協(xié)議中提供的安全參數(shù)產(chǎn)生各種密鑰,利用這些密鑰將客戶機和服務(wù)器之間傳送的數(shù)據(jù)進(jìn)行加密處理(DES、RC4等),對稱加密所產(chǎn)生的密鑰對每個連接都是唯一的[2],網(wǎng)絡(luò)中的非法竊聽者所獲取的信息都將是無意義的密文信息,記錄協(xié)議也支持非加密傳輸,機密性的實現(xiàn)在本章不做討論。消息完整性服務(wù)是指通過特定的算法利用數(shù)據(jù)的原始信息計算出標(biāo)識信息的特征值,此特征值在接收端通過驗證說明消息沒有遭到第三方篡改和破壞。
MAC算法利用摘要算法,計算MAC的初始元素是消息的原始信息,消息被第三方修改后此信息會發(fā)生變化而不能生成相同的MAC。MAC傳送時還需要依賴密鑰,發(fā)送方發(fā)送數(shù)據(jù)時使用共享密鑰對信息進(jìn)行加密,添加一個也是基于該密鑰構(gòu)造的MAC,這樣保證了接收方的身份,因為只有真正的接收方才與其共享解密時需要的密鑰。而接收方也能確認(rèn)發(fā)送方的身份,因為只有發(fā)送方才具有創(chuàng)建消息上的MAC時所需要的密鑰,這樣就可以保證消息的完整性。過程如圖1所示。
圖1 消息完整性原理圖
記錄層所處理的數(shù)據(jù)主要是來自其上層協(xié)議握手層,握手層中的數(shù)據(jù)主要是身份驗證數(shù)據(jù),確定密鑰參數(shù)和加密算法的數(shù)據(jù)以及其所承載的應(yīng)用數(shù)據(jù)。記錄層將數(shù)據(jù)進(jìn)行SSL明文分段、SSL壓縮、SSL密文這些步驟生成一系列的SSL數(shù)據(jù)段,每一個SSL數(shù)據(jù)段均是被單獨保護(hù)且具有驗證消息完整性功能的數(shù)據(jù)包。記錄協(xié)議的操作過程如圖2所示。
圖2 記錄協(xié)議的操作過程
分段是指將數(shù)據(jù)進(jìn)行分塊,每塊最大長度為214byte,對于上層握手協(xié)議的數(shù)據(jù)包,因為其長度都沒有超出需要分段的最大長度故不需要分段。壓縮處理在記錄層協(xié)議中是可選的,若沒有定義壓縮算法可以不壓縮。壓縮必須是無損的,并且不能使內(nèi)容的長度大于1024 byte。
記錄協(xié)議從高層SSL收到傳輸片段之前,根據(jù)經(jīng)過壓縮的數(shù)據(jù)片段計算出MAC值,并與數(shù)據(jù)連結(jié)在一起。通過在壓縮數(shù)據(jù)上計算消息認(rèn)證MAC可以進(jìn)行信息完整性檢查,以驗證其消息是否遭到攻擊。
加密的過程用于提供消息的機密性,對壓縮數(shù)據(jù)和MAC進(jìn)行加密,SSL記錄層協(xié)議也支持明文傳輸,添加記錄頭生成記錄數(shù)據(jù)。
經(jīng)過處理后的SSL數(shù)據(jù)段由記錄頭和長度不為0的記錄數(shù)據(jù)組成的,結(jié)構(gòu)體如圖3所示。其中記錄頭包含了內(nèi)容類型、協(xié)議版本號、長度。長度字段標(biāo)識了記錄的長度,接收方每次只取固定長度的消息,雙方使用的版本磋商依靠版本號來進(jìn)行。SSL需要在同一條受保護(hù)的通道中傳輸控制信息與用戶數(shù)據(jù),由內(nèi)容類型來進(jìn)行區(qū)分[3]。每一條記錄數(shù)據(jù)段中共有3種類型的數(shù)據(jù),即用于驗證消息完整性的MAC數(shù)據(jù)、具有用戶意圖的應(yīng)用數(shù)據(jù)和粘貼在尾部的填充數(shù)據(jù)。實際數(shù)據(jù)即為壓縮后的用戶數(shù)據(jù)和粘貼數(shù)據(jù)是一種填充數(shù)據(jù),指在實際數(shù)據(jù)的尾部添加0數(shù)據(jù),以保證數(shù)據(jù)長度是數(shù)據(jù)塊長度的整數(shù)倍,MAC數(shù)據(jù)將會在下面進(jìn)行詳細(xì)介紹。
圖3 保證消息完整性的數(shù)據(jù)結(jié)構(gòu)
記錄層接收到并為其服務(wù)的數(shù)據(jù)是它的上層協(xié)議握手層中的數(shù)據(jù),所有初始的握手協(xié)議報文在傳送時都是未保護(hù)的,在協(xié)商完成之后,會建立一條新的連接來傳輸應(yīng)用數(shù)據(jù),此連接將以客戶端發(fā)出的一個報文Finished為開始。此數(shù)據(jù)包若被篡改和攻擊,會影響整條應(yīng)用數(shù)據(jù)流的安全性,因此必須對它添加一個標(biāo)識身份的報文識別碼(MAC),這個MAC是通過對握手過程中產(chǎn)生的所有被主密鑰加密后的協(xié)商包計算得出的。只有在驗證了Finished數(shù)據(jù)中的MAC數(shù)據(jù)之后,通信雙方才真正開始傳輸應(yīng)用層上的數(shù)據(jù)。除了Finished數(shù)據(jù),必須保證代表用戶真正意圖的應(yīng)用層的數(shù)據(jù)的消息完整性。因此MAC算法針對的是握手連接建立之后客戶端傳送的第一個Finished數(shù)據(jù)包,以及之后通信雙方傳送的應(yīng)用數(shù)據(jù)包[4]。
消息完整性算法的實現(xiàn)需要計算出能唯一表征此消息的特征值,利用傳輸數(shù)據(jù)計算出的MAC就是針對此功能,對于MAC算法的設(shè)計有兩點要求,第一是不可由特征值推算出原始數(shù)據(jù),即要求MAC算法具有不可逆性。其次,不同的消息要可以生成不同的MAC,這樣可以防止有消息竊聽者將原始消息進(jìn)行替換,即要求算法具有抗沖突性。這正是散列算法的特性,因此SSL采用的MAC算法一般是基于MD5或SHA的散列算法,這里詳細(xì)介紹基于MD5算法的設(shè)計原理。
MD5散列算法的輸入是長度為512位的數(shù)據(jù)分組[5],不同長度的消息在計算時需要確保分組各不相同,因此最后一個分組是由消息、填充字節(jié)以及一個64位的消息長度構(gòu)成的。每一組又被劃分為16個32位子分組,其輸出是4個32位字的級聯(lián)生成的128位散列值。
胡四一:《意見》共分5章20條,明確提出了實行最嚴(yán)格水資源管理制度的指導(dǎo)思想、基本原則、目標(biāo)任務(wù)、管理措施和保障措施。主要內(nèi)容概括來說,就是確定“三條紅線”,實施“四項制度”。
MD5算法共有4輪,每一步都加入了前一步的結(jié)果且有唯一的加法常數(shù),雖然MD5相較于MD4[6]算法更為復(fù)雜,運算速度相對要慢一點,但因為在抗分析安全性上的出色表現(xiàn)已經(jīng)基本取代了MD4。MD5算法中主循環(huán)共4輪,而循環(huán)的次數(shù)由長度為512位的消息分組個數(shù)決定,4輪主循環(huán)中分別用到了下列非線性函數(shù)程序:
這4個非線性函數(shù)對進(jìn)入主循環(huán)的16個32位分組進(jìn)行4輪變換,具體操作如下:首先分別將每個512位的分組輸入分割成4個鏈接變量(A,B,C,D),并創(chuàng)造一份這4個鏈接變量的副本(a,b,c,d),將4個副本中的3個經(jīng)K,M,N,I非線性函數(shù)運算后的結(jié)果與第4個副本相加,再加上一個32位的加法常數(shù),將相加得出的最終結(jié)果循環(huán)左移若干位,再任取a,b,c,d中任意一個與此值相加,即可返回更新A,B,C,D的數(shù)值,這樣便進(jìn)行了一次循環(huán)。
MD5中所用的32位加法常數(shù)靠創(chuàng)建一張i取值為1~64的表H[i]來定義,再取i的正弦絕對值,并對其做4294967296次方運算,得出的整數(shù)部分就是H[i],在變換中對i進(jìn)行冪運算和正弦運算可以更好地消除MD5變換中的線性性[7]。
運算完所有的分組后即輸出MD5算法的散列結(jié)果,將A,B,C,D進(jìn)行級聯(lián)運算后得到的就是最終結(jié)果。下面展示部分MD5算法結(jié)果的例子:
MD5散列函數(shù)的輸入消息長度為512位,生成的固定長度的散列特征值為128位,從而使得幾乎不可能存在函數(shù)的逆。
MD5散列函數(shù)的抗沖突性強度與生成的摘要值長度有關(guān),一個64位的摘要值抗沖突的強度為32位,即128次操作里才可能出現(xiàn)一次沖突。因此兩條不同消息能產(chǎn)生相同摘要值的概率是非常低的。
握手層數(shù)據(jù)中客戶端發(fā)出的Finished消息能確認(rèn)握手過程的真實性,確認(rèn)握手消息是否有被任何攻擊者修改過,是第一條使用最新協(xié)商出的一組密鑰加密實現(xiàn)自我保護(hù)的消息。且Finished消息也是第一條進(jìn)行MAC計算的消息,該MAC算法與應(yīng)用層數(shù)據(jù)的MAC算法相同。如圖4所示,該算法采用兩輪MD5散列算法,第一輪調(diào)用MD5的輸入就是將所有握手消息、Sender常量、主密碼以及一些填充字節(jié)進(jìn)行組合。第二遍調(diào)用MD5的輸入為主密碼、一些填充字節(jié)以及第一次MD5計算輸出的組合。Sender常量可以確保通信雙方產(chǎn)生的Finished消息不會重復(fù),避免第三方重發(fā)Finished消息的攻擊[8]。
圖4 Finished消息的算法
以MD5為基礎(chǔ)的算法中pad_1和pad_2是兩個數(shù)組,pad_1數(shù)組是由固定元素0x36填充,pad_2數(shù)組是由固定元素0x5c填充,且數(shù)組的長度為16 byte,由于MD5的分組長度為64 byte,所以1個16 byte的密鑰就意味著需要48 byte的填充,即pad_1和pad_2的填充長度均為48 byte。使用填充的目的是確保MAC密鑰與填充加在一起可以充滿消息摘要第一塊的整塊空間[9]。
MAC實現(xiàn)總體方案是將用戶的壓縮數(shù)據(jù)進(jìn)行散列(Hash)計算,具體選擇哪種Hash算法是通過握手協(xié)議中選擇的套件來決定的,由圖5可看出一共經(jīng)歷了2輪Hash算法。參與計算的元素有密鑰、pad_1、pad_2、內(nèi)容類型、包長度、數(shù)據(jù)包以及seq_num組成。
圖5 MAC算法的實現(xiàn)
MAC_secret_key分為 Client_write_MAC_secret和Server_write_MAC_secret,它們的使用者身份不同,客戶端發(fā)送的數(shù)據(jù)進(jìn)行MAC計算時會用到的key是Client_write_MAC_secret,服務(wù)器發(fā)送數(shù)據(jù)進(jìn)行MAC運算時用到的key是Server_write_MAC_secret。若想有效地利用MAC算法驗證消息完整性,必須保證密鑰不被竊取和篡改。
seq_num是一個64位的序號,序號是一個可以被發(fā)送和接收雙方遞增的計數(shù)器,計算器可以循環(huán)使用且初始值全為0,即客戶端與服務(wù)器所發(fā)送的第一條消息的序號為0。記錄層協(xié)議需要計算MAC值的第一條消息是握手層數(shù)據(jù)中客戶端發(fā)出的Finished消息,此時序號為初始值全0,之后數(shù)據(jù)每進(jìn)行一次MAC計算,此序號的值就會一次遞增,這樣每個經(jīng)過MAC運算的數(shù)據(jù)包都會按次序分配一個不重復(fù)的序列號來標(biāo)識[8]。
MAC算法需要密鑰的參與,沒有密鑰的非法用戶在改變消息的內(nèi)容后,無法添加正確的MAC值,MAC值驗證將會失敗,從而保證非法用戶無法隨意修改消息內(nèi)容。
SSL利用非對稱密鑰算法加密密鑰的方法實現(xiàn)密鑰交換,保證第三方無法獲取該密鑰。如圖6所示,SSL客戶端利用SSL服務(wù)器的公鑰加密密鑰,將加密后的密鑰發(fā)送給SSL服務(wù)器,只有擁有對應(yīng)私鑰的SSL服務(wù)器才能從密文中獲取原始的密鑰。SSL客戶端發(fā)送給SSL服務(wù)器的密鑰并不能直接用來加密數(shù)據(jù)或計算MAC值,該密鑰是用來計算對稱密鑰和MAC密鑰的信息,稱為Premaster Secret[10]。SSL客戶端和SSL服務(wù)器利用Premaster Secret計算出相同的主密鑰(Mastersecret),再利用Master Secret生成用于對稱密鑰算法、MAC算法等的密鑰。SSL通常采用RSA算法加密傳輸密鑰。
圖6 密鑰交換示意圖
針對消息完整性服務(wù)的攻擊有兩種,分別是重放攻擊和再排序攻擊。
重放攻擊指攻擊者獲取敏感有效數(shù)據(jù)并將它重復(fù)發(fā)送,通過身份驗證欺騙服務(wù)器,以達(dá)到劫持會話的目的。對于這種攻擊僅僅使用MAC是無法防御的,因為重復(fù)的信息包中MAC是正確的。SSL協(xié)議將傳輸?shù)男畔⑦M(jìn)行編號來增加消息的關(guān)聯(lián)性,在通信過程中,將標(biāo)示數(shù)據(jù)包順序的序列號隱藏在生成的MAC中,雙方序列號彼此相互依賴且由通信雙方單獨維護(hù),每一次有新密鑰交換時序列號均進(jìn)行更新,攻擊者在不能提供合法的序列號進(jìn)行會話劫持肯定是失敗的。
再排序攻擊指攻擊者交換一條或多條記錄的順序,使用序號可以檢測出這種攻擊,但由于序號并不在記錄中,所以無法對其加以糾正。因此,SSL必須運行于一種能夠提供可靠傳輸?shù)膫鬏攨f(xié)議之上。TCP滿足這些要求,基于TCP傳輸?shù)臄?shù)據(jù)可以以任何順序到達(dá),但是可以確保應(yīng)用看到的是傳輸時的順序,而UDP不是這樣,因此SSL不能成功地在UDP上運行?;赨DP傳輸?shù)娜魏斡涗浂加锌赡茼樞蝈e亂或者丟失,這看上去就像針對SSL實施的主動攻擊[11]。
SSL記錄層將握手層協(xié)議的數(shù)據(jù)進(jìn)行封裝提供消息完整性和不可讀性。記錄層采用的加密算法和MAC算法在握手層中完成協(xié)商。記錄層還會為傳送的每一條數(shù)據(jù)添加一個序列號,用于檢測消息是否遭到丟失或重放。SSL記錄協(xié)議還可以在握手層協(xié)商好壓縮算法的基礎(chǔ)上進(jìn)行數(shù)據(jù)壓縮。采用散列函數(shù)和機密共享的方法使SSL協(xié)議保證數(shù)據(jù)完整、準(zhǔn)確地到達(dá)對端,從而提供了消息完整性服務(wù)。
[1]RFC2246,The TLS protocol version 1.0[S].1999.
[2]宋志敏,王衛(wèi)京,南相浩.SSL V3.0及其安全性分析[J].計算機工程與應(yīng)用,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協(xié)議的初步研究和應(yīng)用[J].儀器儀表與分析監(jiān)測,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].山東大學(xué)學(xué)報:理學(xué)版,2007(4):42-45.
[8]RESCORLA E.SSL與TLS[M].崔凱,譯.北京:中國電力出版社,2002.
[9]張藝博.OpenSSL源碼的記錄層解析[J].電腦編程技巧與維護(hù),2009(2):48-51.
[10]齊芳,賈維嘉,王國軍.SSL握手協(xié)議中客戶端平衡密鑰交換算法[J]. 計算機工程與應(yīng)用,2007(43):32-36.
[11]趙川,伍瑞卿,樊豐.一種精簡TCP/IP協(xié)議棧的設(shè)計與實現(xiàn)[J].電視技術(shù),2010,34(9):34-39.