◆聶燕屏
(中星電子股份有限公司 北京 100086)
流過濾和Ndis防火墻技術在文件加密保護中的應用
◆聶燕屏
(中星電子股份有限公司 北京 100086)
在這個計算機的信息時代,計算機和網(wǎng)絡的運用無處不在,在各行各業(yè),都會使用計算機,以提高效率,節(jié)省人力。但是隨著計算機技術和應用的普及,安全問題隨之顯現(xiàn)。所以,很多文檔有權(quán)限限制。比如:一些文檔只有相關人員有權(quán)查看,一些文檔需要付費查看,等等。這時候,加密技術就會成為解決問題的手段。對需要權(quán)限的文檔進行加密,擁有相應權(quán)限的個人,可以從文檔的提供方獲取秘鑰對文檔進行解密。只有正確解密的文檔才能被正常瀏覽。本文首先對ndis防火墻技術進行了介紹,分析了ndis技術在文件加密保護中的作用;然后對流過濾技術進行了介紹,并具體講解了流過濾技術在文件加密保護中的應用以及具體算法和流程;最后,針對TCP/IP報文特點,介紹了校驗和算法。
流過濾;Ndis;SMS4;校驗和
對于需要管理并且需要頻繁提供大量文檔的單位,將文檔數(shù)字化無疑是必須的。但是基于安全原因,很多文檔需要加密。但是加密的文檔也帶來一些問題。如果一個文檔存儲和管理系統(tǒng),能夠做到明文存儲,密文發(fā)送,那么無疑是很實用的。所以,本人開發(fā)了這套文件自動加密系統(tǒng)。這套系統(tǒng)的原理就是利用windows ndis級別防火墻的原理對文件進行保護,采取明文存儲,秘文分發(fā)的方式。
Ndis是Network Driver Interface Specification的縮寫,意為“網(wǎng)絡驅(qū)動接口規(guī)范”。Ndis橫跨了傳輸層、網(wǎng)絡層和數(shù)據(jù)鏈路層,其作用是屏蔽了底層物理硬件的區(qū)別。
Ndis支持三種類型的驅(qū)動程序:
Miniport驅(qū)動程序;
中間層驅(qū)動程序;
Protocol驅(qū)動程序。
在這里,我們采用中間層驅(qū)動程序。
1.1 Ndis的版本
Ndis版本從支持的操作系統(tǒng)看可以分類兩類:Ndis5.x和ndis6.x。Ndis6.x對比ndis5.x變化很大,最重要的是NET_BUFFER替代了NDIS_PACKET。鑒于本系統(tǒng)運行的服務器是win2008R2,所以本文中提到的ndis均指ndis6.x。
1.2 Ndis6的數(shù)據(jù)結(jié)構(gòu)以及如何獲取數(shù)據(jù)包
ndis6.0中很重要的兩個數(shù)據(jù)結(jié)構(gòu)是NET_BUFFER_LIST和NET_BUFFER。
一個NET_BUFFER_LIST結(jié)構(gòu)指向的是一連串的NET_BUFFER,這些NET_BUFFER中保存的數(shù)據(jù)包內(nèi)容屬于同一個stream。通過NET_BUFFER_NEXT_NB()可以獲取下一個NET_BUFFER。
1.3 Ndis的相關函數(shù)
在Ndis中,截獲下載數(shù)據(jù)包的關鍵函數(shù)是FilterSendNetBufferLists和FilterSendNetBufferListsComplete。在ndis驅(qū)動安裝成功之后,tcp報文就會在FilterSendNetBufferLists函數(shù)中以NBL的形式存在。對于NBL數(shù)據(jù)的處理,就位于這個函數(shù)中。而FilterSendNetBufferListsComplete的功能是把發(fā)送的結(jié)構(gòu)和數(shù)據(jù)返還給 Filter Driver。
2.1 關于流過濾技術
流過濾技術是在包過濾技術的基礎上提出的。流過濾處理的基本單元是數(shù)據(jù)包,但并不僅限于數(shù)據(jù)包。
包過濾技術關注的重點是網(wǎng)絡層和傳輸層,根據(jù)這幾個層次在單個數(shù)據(jù)包中的信息進行過濾。而流過濾注重的是應用層。
在這里,我利用流過濾的原理,對數(shù)據(jù)包中的應用層信息,進行加密處理。
2.2 技術方案
這里,以Http傳輸為例,講解流過濾技術在文件加密中的技術方案。http走的協(xié)議是tcp報文,在流過濾方案中,截獲的封包是tcp包。處理流程如下:
對截獲的tcp報文進行分類處理。
對1中篩選后的報文進行分析和再次篩選。
對選中的報文記錄該報文的源,目的ip和端口。對此連接的tcp包進行滯留。并且接管此tcp連接。
對滯留的數(shù)據(jù)包進行重組,加密。
將加密后的數(shù)據(jù)還原,繼續(xù)轉(zhuǎn)發(fā),并且歸還此tcp連接。
2.2.1 報文的分類
因為我們的目的是對http下載攜帶的文件內(nèi)容進行加密處理,所以我們關注的重點是帶有應用層數(shù)據(jù)的tcp報文。
Tcp報文首先可以分為帶有應用層數(shù)據(jù)的和不帶有應用層數(shù)據(jù)的。應用層無關報文主要是SYN,F(xiàn)IN,ACK等報文,用于tcp連接和可靠性傳輸。這類報文和我們的應用無關,直接轉(zhuǎn)發(fā)即可。
2.2.2 報文的分析和篩選
帶有應用層數(shù)據(jù)的tcp報文,我們可以進行定向的篩選:以應用層協(xié)議關鍵詞進行篩選。比如http協(xié)議,應用層會有“HTTP”字樣的關鍵字。然后,深入對http進行分析,http協(xié)議有POST,GET和應答。傳輸文件的關鍵數(shù)據(jù)包一般在200OK的應答中。特征是transfe-Encoding的chunk類型(代表以chunk方式控制文件大?。?,以及filename中的擴展文件名來確定是否是加密需要的報文。
2.2.3 報文的滯留,重組和加密
文件加密根據(jù)算法需要加密4096字節(jié)的數(shù)據(jù)。而tcp荷載數(shù)據(jù)的報文一般長度是1514,所以需要合并幾個連續(xù)報文以得到4096字節(jié)文件內(nèi)容。
因為是網(wǎng)絡傳輸,tcp報文很有可能是亂序的。所以需要根據(jù)tcp的序列號對tcp報文進行重組。Tcp包下一序列號=序列號+數(shù)據(jù)長度。這里的數(shù)據(jù)長度是指傳輸?shù)臄?shù)據(jù)大小,不包括ethernet,ip,tcp的報頭的長度。
為了重組報文,需要維護兩個隊列:順序隊列和亂序隊列。
(1)順序隊列
截獲一個新的報文后,判斷順序隊列是否為空,若為空,判斷報文的序列號是否等于startseq,是則插入順序隊列,否,則按照升序插入到亂序隊列。
如果順序隊列不為空,判斷當前序列號是否等于順序隊列結(jié)尾的序列號加上數(shù)據(jù)長度。若是則插入順序隊列結(jié)尾,否則按照升序插入亂序隊列。
(2)亂序隊列
首先判斷亂序隊列開始的tcp序列號,與順序隊列結(jié)尾報文的下一序列號的大小關系。
如果等于,則將亂序隊列的開始報文插入順序隊列的結(jié)尾;
如果大于則本輪處理結(jié)束;
如果小于,則直接丟棄該報文。
保活。
①發(fā)送端
對于tcp連接,系統(tǒng)將報文滯留于,發(fā)送端得不到報的回應勢必會影響連接。所以我們需要偽裝成接收端向發(fā)送端發(fā)送ack回應。Ack數(shù)據(jù)報文的序列號等于當前tcp的確認號,確認號,在順序隊列為空時,等于startseq,否則等于順序隊列結(jié)尾報文的下一序列號。
②接收端
從截獲第一個需要重組的報文起,需要每隔一段時間向接收端發(fā)送ack報文以保證連接。此報文的序列號等于startseq,確認號和所有滯留重組的tcp報文確認號相等。
2.2.4 報文的加密
因為根據(jù)SMS4加密算法的特性,加密的最小數(shù)據(jù)單位是16字節(jié),所以,結(jié)合實際應用,本系統(tǒng)采用一次性截獲全部4096文件內(nèi)容,然后加密的方式。
在數(shù)據(jù)報文滯留排序好之后,定位數(shù)據(jù)位置,為了能夠恢復原有的數(shù)據(jù)包,需要用指針鏈表,對數(shù)據(jù)位置進行記錄,以便將加密后的內(nèi)容拷貝回去。
指針鏈表元素的數(shù)據(jù)結(jié)構(gòu)主要記錄兩點:指針和長度。
對于每一個被放入順序隊列中的tcp包,均分配一個指針鏈表元素,記錄下數(shù)據(jù)所在的起始地址,以及數(shù)據(jù)實際長度,然后對數(shù)據(jù)長度進行累加。當順序表中的實際數(shù)據(jù)長度>=4096時,將數(shù)據(jù)拷貝出來,調(diào)用加密接口對4096字節(jié)進行加密,然后根據(jù)指針鏈表中的元素,將數(shù)據(jù)拷貝回去之后,對tcp數(shù)據(jù)包重新計算校驗和,就可以繼續(xù)轉(zhuǎn)發(fā)了。
對于一個TCP報文來說,如果它所負載的數(shù)據(jù)被修改,就需要重新計算校驗和,否則數(shù)據(jù)包不會被正常的接收。
Tcp數(shù)據(jù)封包所涉及的校驗和分為兩種:ip校驗和以及tcp校驗和。TCP校驗和覆蓋TCP首部和TCP數(shù)據(jù),而IP首部中的校驗和只覆蓋IP的首部,不覆蓋IP數(shù)據(jù)報中的任何數(shù)據(jù)。
TCP首部校驗和計算三部分:TCP首部+TCP數(shù)據(jù)+TCP偽首部。
偽首部是為了增加TCP校驗和的檢錯能力:如檢查TCP報文是否收錯了(目的IP地址)、傳輸層協(xié)議是否選對了(傳輸層協(xié)議號)等。偽首部來自IP首部。
TCP校驗和的大致方法如下:
(1)把偽首部、TCP報頭、TCP數(shù)據(jù)分為16位的字,如果總長度為奇數(shù)個字節(jié),則在最后增添一個位都為0的字節(jié)。
(2)把TCP報頭中的校驗和字段置為0。
(3)用反碼相加法累加所有的16位字(進位也要累加)。
以上結(jié)果即作為TCP的校驗和。
如果tcp包長度改變,還要對ip報頭重新計算校驗和。
綜上所述。文件自動加密系統(tǒng)根據(jù)防火墻和流過濾的思想,對從文件服務器下載的文件進行加密保護。主要用到的技術有Ndis驅(qū)動級防火墻技術以及SMS4加密算法技術。本系統(tǒng)主要針對TCP/IP協(xié)議的特點,對經(jīng)過Ndis驅(qū)動的tcp報文進行分類過濾,并根據(jù)http協(xié)議的特點,對文件進行還原加密,以起到保護文件的作用。
本文的主要研究工作有:
(1)Ndis驅(qū)動程序在文件保護中的作用。
(2)流過濾思想在文件保護中的應用。
[1]朱雁輝.windows防火墻與網(wǎng)絡封包截獲技術[M].北京:電子工業(yè)出版社,2002.
[2]yexin218.Filter驅(qū)動開發(fā)筆記[EB/OL]. http://www.doci n.com/p-97160849.html&endPro=true.
[3]梁軍學.深度包檢測技術原理及應用[EB/OL].北京郵電大學網(wǎng)絡技術研究院.