基于過(guò)濾驅(qū)動(dòng)的局域網(wǎng)透明文件加密方法

在當(dāng)今社會(huì)隨著計(jì)算機(jī)與網(wǎng)絡(luò)技術(shù)的不斷發(fā)展,企業(yè)信息化程度也越來(lái)越高,而企業(yè)局域網(wǎng)信息安全也成為研究的熱點(diǎn)。其中內(nèi)網(wǎng)信息安全也因其重要性成為眾多企業(yè)關(guān)注的焦點(diǎn),然而企業(yè)很難做到有效控制員工將數(shù)據(jù)外流泄密的行為,雖然企業(yè)對(duì)此做出了監(jiān)控,但是還是防不勝防,在這種情況下可以采取文件加密方式,傳統(tǒng)的文件加密方式總會(huì)改變用戶(hù)的操作習(xí)慣,并且不能做到強(qiáng)制性加密,局域網(wǎng)透明文件加密由此應(yīng)運(yùn)而生。所謂的透明文件加密,就是指對(duì)用戶(hù)來(lái)說(shuō)是未知的。當(dāng)用戶(hù)打開(kāi)或編輯指定文件時(shí),系統(tǒng)將自動(dòng)對(duì)未加密的文件進(jìn)行加密,對(duì)已加密的文件自動(dòng)解密。文件在硬盤(pán)上是密文,在內(nèi)存中是明文。一旦離開(kāi)使用環(huán)境,由于應(yīng)用程序無(wú)法得到自動(dòng)解密的服務(wù)而無(wú)法打開(kāi),從而起到保護(hù)文件內(nèi)容的效果。

一、文件過(guò)濾驅(qū)動(dòng)原理

目前對(duì)于文件加密技術(shù)這一領(lǐng)域,主要出現(xiàn)的有微軟推出的加密文件系統(tǒng)以及基于鉤子(Hook)技術(shù)的文件加密技術(shù),但這兩種技術(shù)也存在缺陷。下面將詳細(xì)討論文件過(guò)濾驅(qū)動(dòng)的工作原理。

文件系統(tǒng)驅(qū)動(dòng)主要是負(fù)責(zé)維護(hù)各種文件系統(tǒng)的磁盤(pán)結(jié)構(gòu)以及用戶(hù)與底層非易失型存儲(chǔ)介質(zhì)之間的交互。文件系統(tǒng)驅(qū)動(dòng)工作原理主要是依賴(lài)I/o管理器的,在文件驅(qū)動(dòng)接收到應(yīng)用程序Open、Create、Read、Write和Close文件的請(qǐng)求之前,I/O管理器要取得文件驅(qū)動(dòng)層在管理器中的注冊(cè)信息,這樣當(dāng)截取到上層應(yīng)用程序發(fā)送的訪(fǎng)問(wèn)磁盤(pán)邏輯卷請(qǐng)求時(shí),I/O管理器就能夠識(shí)別這一動(dòng)作,將請(qǐng)求發(fā)送到文件驅(qū)動(dòng)層。當(dāng)文件系統(tǒng)驅(qū)動(dòng)處理完請(qǐng)求后會(huì)將處理完的請(qǐng)求發(fā)送到底層的存儲(chǔ)設(shè)備驅(qū)動(dòng)程序,通過(guò)存儲(chǔ)設(shè)備驅(qū)動(dòng)程序?qū)⑽募畔?xiě)到物理磁盤(pán)上面,如圖1所示。

基于過(guò)濾驅(qū)動(dòng)的局域網(wǎng)透明文件加密方法

由于Windows文件系統(tǒng)的驅(qū)動(dòng)模型WDK( Win-dows Driver Kit)是采用分層的結(jié)構(gòu),這樣在使用IRP機(jī)制的內(nèi)核層,可以使驅(qū)動(dòng)程序通過(guò)將構(gòu)造的匿名設(shè)備對(duì)象負(fù)載在已知的設(shè)備對(duì)象上,而這個(gè)匿名的設(shè)備對(duì)象就是所謂的驅(qū)動(dòng)設(shè)備對(duì)象,與之相關(guān)聯(lián)的驅(qū)動(dòng)程序就是過(guò)濾驅(qū)動(dòng)程序。這種分層的結(jié)構(gòu)允許在IRP包到達(dá)目標(biāo)設(shè)備對(duì)象之前首先會(huì)判斷有沒(méi)有匿名的設(shè)備對(duì)象,如果有就將IRP包發(fā)送給匿名設(shè)備,匿名設(shè)備然后會(huì)根據(jù)IRP包的信息調(diào)用相應(yīng)的驅(qū)動(dòng)程序處理,當(dāng)匿名設(shè)備加載完成特定的功能之后,然后將IRP包發(fā)往下層驅(qū)動(dòng)設(shè)備。

二、基于過(guò)濾驅(qū)動(dòng)的透明文件安全加密方法

在改進(jìn)現(xiàn)有的文件安全加密技術(shù)的基礎(chǔ)上,設(shè)計(jì)了基于文件過(guò)濾驅(qū)動(dòng)的透明文件加密方法,如圖2所示。

基于過(guò)濾驅(qū)動(dòng)的局域網(wǎng)透明文件加密方法

新設(shè)計(jì)的方法主要分為兩大部分:客戶(hù)端和服務(wù)端。客戶(hù)端模塊的主要作用是給終端用戶(hù)提供客戶(hù)端身份認(rèn)證、透明加密和解密服務(wù)、訪(fǎng)問(wèn)控制服務(wù)等功能。客戶(hù)端按操作系統(tǒng)的運(yùn)行可分為用戶(hù)態(tài)和內(nèi)核態(tài),用戶(hù)態(tài)主要實(shí)現(xiàn)通信代理、策略配置、密鑰管理、讀/寫(xiě)操作等功能,而內(nèi)核模態(tài)主要實(shí)現(xiàn)過(guò)濾驅(qū)動(dòng)技術(shù)也是要討論的重點(diǎn),用戶(hù)態(tài)主要是為內(nèi)核模態(tài)提供加密服務(wù)的;服務(wù)端模塊的主要作用是方便管理員有效地控制整個(gè)加密系統(tǒng),并為客戶(hù)端提供策略分配服務(wù),所有的客戶(hù)端請(qǐng)求都將通過(guò)策略服務(wù)器得到響應(yīng)。

過(guò)濾驅(qū)動(dòng)關(guān)鍵技術(shù):

為了實(shí)現(xiàn)對(duì)文件的加解密與訪(fǎng)問(wèn)控制,需要攔截上層發(fā)送的包(r/o Request Packet,IRP),如圖2所示。當(dāng)攔截到加密寫(xiě)操作IRP包時(shí),則申請(qǐng)新密鑰與文件加密標(biāo)志,從IRP指定的地址中讀取明文,用對(duì)稱(chēng)加密算法對(duì)其加密,并且向下層傳遞IRP將密文寫(xiě)入磁盤(pán)上,最后在完成方法中恢復(fù)明文信息,同時(shí)把文件的相關(guān)信息記錄到文件加密屬性中,否則正常處理。

當(dāng)攔截到讀操作IRP包時(shí)首先判斷當(dāng)前文件是否存在密鑰,如果存在,則解密,否則直接把數(shù)據(jù)向下提交。

以上分析了加解密的主要流程,下面將對(duì)獲取機(jī)密進(jìn)程、加密標(biāo)志設(shè)置以及加密處理等關(guān)鍵技術(shù)進(jìn)行研究。

1、獲取機(jī)密進(jìn)程

在經(jīng)過(guò)加密的操作系統(tǒng)中,所有的進(jìn)程被分為兩類(lèi):機(jī)密進(jìn)程和普通進(jìn)程,但是由于進(jìn)程的名字很容易被偽造,所以在內(nèi)核中,可以對(duì)進(jìn)程名與同名可執(zhí)行文件的內(nèi)容進(jìn)行驗(yàn)證,來(lái)防止非法的仿冒行為。首先獲取當(dāng)前進(jìn)程的名字,EPROCESS結(jié)構(gòu)是Windows內(nèi)部的每個(gè)進(jìn)程都維護(hù)的一個(gè)保存進(jìn)程名的結(jié)構(gòu)。在內(nèi)核模塊的DriverEntry函數(shù)總會(huì)執(zhí)行一個(gè)名為“Sys-tem”的進(jìn)程,那么可以確定DriverEntry當(dāng)前進(jìn)程名為“System”。雖然不知道EPROCESS結(jié)構(gòu)的具體內(nèi)容,但是可以在EPROCESS中搜索“System”這個(gè)字符串,一旦搜索到,記錄下偏移位置。

這樣,以后要從EPROCESS獲得進(jìn)程名字時(shí),就可以直接從這個(gè)位置取了。下面介紹具體的偽代碼實(shí)現(xiàn)。

首先在獲取進(jìn)程名字之前要先進(jìn)行初始化,初始化函數(shù)為cfCurPtocNamelnit,這個(gè)函數(shù)必須在DriverEntry中調(diào)用,否則cfCurProcName將不起作用。并且設(shè)置靜態(tài)變量size_t_cf_proc_name_offset=0;保存要尋找的偏移位置,這個(gè)函數(shù)很簡(jiǎn)單。先通過(guò)PsGct-CurrentProcess得到當(dāng)前EPROCFSS的位置,然后充分相信其中有一個(gè)字符串“System”,搜索后得到偏移位置保存在一個(gè)靜態(tài)變量中,下面的cfCurProName函數(shù)就是獲取程序名字的關(guān)鍵代碼。

ULONG cfCurProName( PUNICODE_STRING name)

{

PEPROCESS curproc;//聲明一個(gè)EPROCESS指針

ULONG i,need_len;

if( s_cf_proc_name_offset==0)

retum O;

curpro= PsGetCurrentProcess();//獲得當(dāng)前進(jìn)程,然后移動(dòng)一個(gè)偏移位置得到進(jìn)程名所在的位置

}

2、加密標(biāo)志設(shè)置

當(dāng)機(jī)密進(jìn)程獲取一個(gè)文件時(shí),如何判斷這個(gè)文件是已經(jīng)加密的還是未加密的,這需要在硬盤(pán)中保留一個(gè)文件是否已經(jīng)被加密的信息,這種信息稱(chēng)為加密標(biāo)志。這種信息必須保存在硬盤(pán)上,和文件一起存在。一個(gè)選擇是,在文件以外的地方保存這個(gè)信息。比如另建一個(gè)隱藏文件,保存當(dāng)前目錄下其他文件的加密標(biāo)志,但是這種方法非常麻煩,所以在此選擇在文件內(nèi)容中保存加密標(biāo)志,在文件內(nèi)容中保存加密標(biāo)志也有兩種選擇:基于文件頭和文件尾,基于文件尾比較容易實(shí)現(xiàn)但是有安全隱患,在此選擇基于文件頭,選擇文件頭的好處是穩(wěn)固可靠,位置固定缺點(diǎn)是實(shí)現(xiàn)起來(lái)相對(duì)要困難。由于要實(shí)現(xiàn)對(duì)所有的機(jī)密進(jìn)程隱藏這個(gè)頭部,則所有文件都要增加一個(gè)偏移,下面給出了一個(gè)記事本隱藏文件頭的設(shè)置偏移,比如記事本如果試圖把文件大小設(shè)置為1kB,假設(shè)文件頭為4kB大小,那么實(shí)際的文件應(yīng)該被設(shè)置為SkB,實(shí)現(xiàn)的偽代碼如下:

//對(duì)所有設(shè)置請(qǐng)求進(jìn)行修改,使之隱去前面的4kB文件頭

void , PIO_STACK_I.O-C.ATION irpsp)

{

PUCHAR buffcr=irp ->Associatedlrp. System-Buffer;//取得文件緩沖句柄

NTSTATUS status;

ASSERT( irp一>MajorFUNCTION=IRP_ MJ_SET_INFORMATION);//用于調(diào)試環(huán)境的聲明

switch( irpsp - >PArameters. SetFile. Filelnformation-Class)

case FileAllocationlnformation:{

......//增加在FileAlloca-tionlnformation條件下的文件偏移

}

......};

}

上面只給出了FileAllocationlnformation一種情況,其他情況類(lèi)似,通過(guò)隱藏文件頭,就可以在文件頭設(shè)置加密標(biāo)志。

3、加密處理

當(dāng)上層的應(yīng)用程序?qū)δ骋活?lèi)文件設(shè)置加密操作的規(guī)則,底層的過(guò)濾驅(qū)動(dòng)層截取到文件創(chuàng)建的IRP請(qǐng)求時(shí),則首先讀取文件加密標(biāo)志,根據(jù)加密標(biāo)志來(lái)決定是否要進(jìn)行加密操作,如果需要進(jìn)行加密操作,則通過(guò)事先寫(xiě)好的加密函數(shù)一般使用AES加密算法,從服務(wù)器獲取加密密鑰對(duì)文件進(jìn)行加密。當(dāng)加密好文件之后根據(jù)寫(xiě)IRP請(qǐng)求將加密好的文件寫(xiě)入物理磁盤(pán)。

當(dāng)對(duì)加密過(guò)的文件進(jìn)行讀請(qǐng)求時(shí),首先判斷是否可以通過(guò)FastIODispatch例程在Cache管理器處獲取。如果可以的話(huà)直接從Cache中讀取明文,否則調(diào)用底層驅(qū)動(dòng)從磁盤(pán)讀取數(shù)據(jù),在應(yīng)用層獲得服務(wù)器的解密密鑰通過(guò)I/O完成例程對(duì)文件數(shù)據(jù)進(jìn)行解密操作‘10 -12]。下面的代碼主要針對(duì)文件的加密操作:

NTSTATUS EFWrite (IN PDEVICE_OBJECT Devi-ceObject, IN PIRP Irp)

{

.....

if( IS_ControI_MY _DEVICE_ OBJECT( DeviceOb-ject))

{

......

CompletionIoRequest(Irp, JO.NO—INCRF-MENT);//完成不需要加密的請(qǐng)求

retum STATUS—IRP一- INVALID—DEVICE—RE-QUEST;

}

IoCopyCurrentFileToNextlrpStackLocation(IrP),//拷貝需要寫(xiě)入文件的數(shù)據(jù)到新開(kāi)辟的MDL內(nèi)存

EncriptMyFile( dataBuffer,length,key);//加密函數(shù)的調(diào)用

}

解密操作類(lèi)似。

三、實(shí)驗(yàn)與結(jié)果分析

建立測(cè)試環(huán)境如下:acer臺(tái)式機(jī)一臺(tái),CPU為Pentium( R) Dual-Core E5300 2.60GHz,內(nèi)存為2G,硬盤(pán)250G,操作系統(tǒng)為Windows XP( SP2)。

通過(guò)配置了TXT文檔的文件保護(hù)策略并使用了AES對(duì)稱(chēng)加密算法,在一個(gè)既有FAT分區(qū)也有NTFS格式分區(qū)的操作系統(tǒng)中,進(jìn)行文件的操作,結(jié)果表明系統(tǒng)可以在FAT分區(qū)和NTFS分區(qū)很好的工作,對(duì)所有txt類(lèi)型文件都進(jìn)行了加密存儲(chǔ),寫(xiě)入的明文如圖3所示:

基于過(guò)濾驅(qū)動(dòng)的局域網(wǎng)透明文件加密方法

當(dāng)在另外一臺(tái)沒(méi)有加密方法的電腦上看這些文件都是亂碼,看不到真實(shí)信息,如圖4所示:

基于過(guò)濾驅(qū)動(dòng)的局域網(wǎng)透明文件加密方法

并且還對(duì)加密過(guò)程使用DebugView進(jìn)行了檢測(cè),通過(guò)使用DebugView的檢測(cè)可以對(duì)內(nèi)核態(tài)程序的運(yùn)行過(guò)程有一一個(gè)大致的了解,如圖5所示:

基于過(guò)濾驅(qū)動(dòng)的局域網(wǎng)透明文件加密方法

實(shí)驗(yàn)結(jié)果表明基于過(guò)濾驅(qū)動(dòng)的文件加密方法可以在不改變用戶(hù)的使用習(xí)慣的情況下很好地提供加密與解密操作。

小知識(shí)之透明加密

透明加密技術(shù)是近年來(lái)針對(duì)企業(yè)文件保密需求應(yīng)運(yùn)而生的一種文件加密技術(shù)。所謂透明,是指對(duì)使用者來(lái)說(shuō)是未知的。當(dāng)使用者在打開(kāi)或編輯指定文件時(shí),系統(tǒng)將自動(dòng)對(duì)未加密的文件進(jìn)行加密,對(duì)已加密的文件自動(dòng)解密。文件在硬盤(pán)上是密文,在內(nèi)存中是明文。一旦離開(kāi)使用環(huán)境,由于應(yīng)用程序無(wú)法得到自動(dòng)解密的服務(wù)而無(wú)法打開(kāi),從而起來(lái)保護(hù)文件內(nèi)容的效果。