保护信息安全最常用的技术手段是数据加密技术,通常的加密系统加密解密程序运行在操作系统的用户态,这种方式存在一定的不便,每次访问文件,用户必须手动进行加密解密操作用户的错误操作有时会破坏数据或者导致机密数据的泄露,另外当用户正常使用文件时,文件必须以明文形式存储在磁盘上。解决上述问题的有效方法是在操作系统的内核态对数据进行透明加密解密处理,加密解密文件系统(如微软的NTFS中的EFS,Encryp tion File System)的数据处理处在文件系统驱动层,文件系统拥有以文件或目录的粒度访问文件的能力,所以加密文件系统能够对加密范围进行灵活的控制,但是加密文件系统在设计与实现较为复杂。
本文阐述的方法基于Windows NT内核操作系统的驱动框架,通过在文件系统驱动层与应用层之间添加过滤驱动层,截获传输的数据并进行相应的加密解密处理,处在操作系统内核态的过滤驱动层可以方便地控制加密解密文件的粒度,同时减少用户加密解密操作的参与,与加密文件系统的方式相比,基于过滤驱动层的加密系统设计开发相对简单,功能扩展灵活。最后通过使用智能卡作为加解密密钥的存储容器,进一步增强整个系统的安全。
一、系统原理及框架结构
WindowsNT内核的操作系统(Windows 2000、WindowsXP、Windows 2003)的驱动模型WDM(Windows Driver Model)具有层次化的结构在这种结构中,每一层的驱动依次处理的请求包(IRP,I/O Request Package)。过滤驱动的原理是通过插入过滤驱动层截获上层驱动发往下层驱动的IRP,对驱动之间传输的数据进行相应的操作文件系统过滤驱动处于文件系统驱动层之上,截获从上层组件发送到文件系统驱动层的IRP,文件系统过滤驱动技术目前在实时病毒监测,文件访问监控日志记录等方面有着广泛的应用,基于过滤驱动的加密系统的原理结构如图1所示。
在Window sNT内核操作系统中,应用层程序的一次数据读请求的处理过程简单描述如下:
1、应用层程序调用系统内核组件提供的函数接口向的管理器(I/O Manager)发送数据读请求。
2、I/O管理器构造数据读请求对应的IRP,然后将此IRP发送到文件系统驱动(File SystemD river)。
3、文件系统驱动中的数据读分发例程接收到IRP后判断所请求的数据是否可从缓存管理器(CacheM anager)获得:
a)缓存管理器存在请求的数据
i文件系统驱动调用I/O管理器的函数接口告知此数据读请求可通过Fast的请求获得。
iiI/O管理器构造Fast I/O请求的IRP再次发送给文件系统驱动。
iii文件系统驱动调用Fast I/O分发例程从缓存管理器中获取数据返回给I/O管理器。
b)缓存管理器不存在请求的数据
i文件系统驱动IRP数据读分发例程将IRP发送到底层磁盘驱动(Disk Driver)。
ii磁盘驱动程序从物理磁盘中获取请求的数据返回给上层驱动。
4、I/O管理器最终将请求的数据返回给应用程序
对于数据写请求,文件系统驱动将数据先写入缓存,然后在适当的时候缓存管理器会间接调用I/O管理器发送数据写请求最终将缓存中的数据写入到物理磁盘另外WindowsNT内核操作系统为了提高读数据性能,缓存管理器会适时的进行数据预读操作,缓存管理器间接的调用的管理器将数据预读请求发送到文件系统驱动,文件系统驱动再将请求发送到磁盘驱动以获取数据。
在I/O管理器与文件系统驱动层之间插入过滤驱动层,截获的管理器发往文件系统驱动的读写IRP,对传输的数据进行相应的加解密处理,数据读请求时对读入的数据进行解密;数据写请求时对写出的数据进行加密添加过滤驱动层后数据写请求处理流程如图2所示通过这种方式保证磁盘中存储的数据文件始终以密文形式存在,而应用程序无需做额外的操作便可以正常地使用文件另外根据文件的全路径名称可以对指定目录下或指定类型的文件进行加解密处理。
将加密解密操作中使用的密钥存储于智能卡内部提高了密钥的安全性,处在应用层的服务进程(Server Process)监测智能卡的相关操作:当用户插入智能卡成功地通过智能卡PIN认证后,服务进程从智能卡内读出加解密密钥,通过I/O管理器以IRP的形式将密钥相关信息发送到文件系统过滤驱动层,文件系统过滤驱动层的相应分发例程接收处理此IRP后,将接收到的密钥存储在内存相应的数据结构中;当用户取出智能卡后,服务进程通过的管理器将以IRP形式的通告发送到文件系统过滤驱动层,文件系统过滤驱动层接收到此IRP删除存储在内存中密钥这种方式保证了数据只可以被授权的用户所使用。
二、核心技术要点
1、驱动层获取文件名
在驱动层获取文件名称有助于系统灵活地对指定目录下、指定类型的文件进行加解密在windows NT内核的操作系统中,每当一个文件被打开时,I/O管理器会创建一个数据类型为FLEOBJECT结构体变量来标识此文件流FLEOBJECT结构体的定义简略如下代码所示对同一个文件进行多次打开操作会导致多个FLEOBJECT变量被创建。
typedef struct-FLEOBJECT{
struct-FLEOBJ ECT*Rela tedFileo bject;
PVO D FsContext;
UNICODE-STRNG FileName;
....
}FL EOBJECT;
操作系统创建一个类型为文件控制块(FCB,FileCon trolBlock)的数据结构作为每个文件在内存中的唯一标识FLEOBJECT数据结构中的FsCon text指针指向此文件控制块FLEOBJECT数据结构中的FileName代表文件流对应文件的名称,但是FileName仅仅在对文件进行创建或者被打开操作时才有效另外根据文件的创建或打开是绝对路径还是相对路径操作,FileName存储的内容有所不同。
在WDM中文件的创建或打开操作对应的IRP类型为IRPMJ-CREATE在IRPMJ-CREA TE对应的分发例程中根据FLEOBJECT, FileName构造出文件的全路径文件名称,然后将此全路径文件名称与文件控制块的指针FLEOBJECT.FsCon text作为一个数据结构单元添加到一个全局链表结构中.当在其他的驱动分发例程需要获取某文件对象对应文件的名称时,通过FLEOBJECT.FsCon text指向的文件控制块在上述全局链表中查找到对应的文件名称当文件被最终关闭时(从属于同一文件的文件对象变量的个数为零),将全局链表结构中此文件对应的节点删除。
构造文件的全路径名称主要分为绝对路径与相对路径两种情况具体的操作流程如下代码所示:
if Fileo bject-> RelatedFileo bject= = NULLtrH.begn
FuIIPathN am e: = Fileo bject-> FileN ame;
end else
begin
varnew Irp: IRP * ;
relatedFileo bject: = Fileo bject-> RelatedFileo bject;
new Irp: = BuildN am eQ uery RP (irp , relatedFileo bject);
Send JRPToLow erD river(new Irp) ;
W aitIRPCompletion () ;
FuIIPathN am e: = GetR esultF rom IRP (new hp) ;
FuIIPathN am e: = FuIIPathN am e+ Fileo bject-> FileName;
end
2、数据读写的加密解密机制
Windows NT内核的操作系统中,程序通过虚拟地址访问数据虚拟地址以固定大小的页面为单位与物理内存地址相映射,将数据读入到内存或者将内存中数据写入到物理磁盘上需要进行页面数据的读写(PA GN G的)。应用程序的正常运行要求内存中存储的数据必须始终以未加密的形式存在在处理数据读写IRP时,仅针对标记(IRP-> Flags)为JRP-NO -CACHE JRP-PAGNG-D的IRP请求进行处理JRP-NO -CACHE标记表示数据不可以被缓存处理(从缓存中读取或写入到缓存中),IRP-PA GN G-D标记表示此IRP为页面数据读写:
typedef struct-RP{
PM DL M dlA ddress;
ULON G FlagS;
}IRP,*PIRP;
IRP结构的简略定义如上代码所示其中M dIA ddress指向类型MDL(Memory Descrp to rList)的数据结构,这个数据结构用于标识驱动层之间传输数据的内存缓冲区;Flags用于标识lRP的类型。
1)数据读操作
数据读操作的IRP类型为RPMJ-READ.RPMJ-READ的分发例程处理步骤如下所述:
procedure readFilterRoutine (irp:PIRP) ;
var buffer: VOID * ;
begin
if Wvl yFlags(up -> Flags) : = falsa then
begin
Send RPToL ow erD river(irp) ; return;
end
buffer: = GetA ddressF romMDL (irp -> M dIA ddress) ;
Send IRPToL ow erD river(irp) ;
WaitIR PCompletbn();
D ataD ecrytion (buffer);
end
其中IM yFlags()用于判断IRP-> Flags是否为RP-NO -CACHEJRP-PA GN G—D类型的IRP请求,GetA ddressF romM DL()用于将从M DL结构中获取缓冲区的内存地址在进行数据解密操作时,由于存储数据的缓冲区对应的内存页面未加入到应用程序所属进程的工作集中,所以解密操作不会与应用程序的数据操作产生冲突。
2)数据写操作
数据写操作的IRP类型为JRPMJW RITEJRPM J.WR ffE分发例程的处理步骤如下所述:
pr ooedurew riterF ilter (irp:P IRP);
var buffer, newB uffer: VO D+:begin
if LsM yFlags(irp-> Flags):=falsa then
begin
Send JR PToL ow erD river(irp) ; return;
end
buffer = Ge tA dd ressF romM DL (irp -> M dIAddress) ;
newB uffer= M em o ryA llocate ( sizeof (buffer));
M emoryCopy (newBuffer, buffer) ;
D ataEncryp tion (newBuffer) ;
irp-> M dIA dd ress: = Ge tM DL F romA ddress (newBuffer) ;
Send IR PToL ow eD river (irp) ;
WaitIRPCompletion () ;
up-> M dlA dd ress: = GerM DL F romA ddress(buffer) ;
数据写操作时,待写缓冲区所对应的页面仍处于应用程序所属进程的工作集中,通过对新分配内存中数据进行加密操作,避免了数据在加密时应用程序同时访问数据导致数据的不一致在底层驱动处理完IRP后必须恢复irp一>MdA ddress的值以避免上层组件因irp->M dIA ddress值发生改变而产生异常。
3、数据的加密解密方式
对于一个文件内容的读写,通常需要多个IRP来完成,每个IRP负责读写文件的部分数据在对每个IRP中传输的数据进行加密或解密处理时不可以更改处理数据的长度,流加密算法可克服这个限制,但是流加密算法与分组加密算法相比安全强度较低为了使用分组加密算法,可以采用计数器(CTR)加密模式计数器加密模式具有简单、高效、随机性访问等优点。计数器加密模式的数据加密过程如图3所示,数据的解密过程将Plain text与Cphertext的位置交换即可。
采用计数器模式的分组加密算法对数据进行加密解密,将每个分组中Counter加密后的结果Coun ter*进行预存储,加密数据时取出相应的部分与明文直接进行异或操作例如采用分组大小为128位的AES加密算法,可以构造总大小为256KB的Counter*,对于文件小于256KB部分的数据直接与对应的Counter*部分进行异或操作对于文件大于256KB部分的数据,动态地计算对应的Coun ter*。通过这种方式有效地提高了一般大小(小于256KB)的文件的加密解密速度。
4、驱动层与应用层的交互
本系统中服务进程与文件系统过滤驱动层的通讯基于WDM中I/o ControICodes( DCTLs)机制DCT4b的基本原理如下所述:
处于用户态的应用程序调用DeviceIoControl函数,Device JoControl函数的调用导致I/O管理器发送类型为RP-MJDEVICE-CONTROL的IRP到底层驱动,底层驱动RPMJDEV JCE-CONTROL分发例程处理此RP。在本系统中服务进程向文件系统过滤驱动程序发送两种DCTL,一种用于传输从智能卡中获取的文件加解密密钥,一种用于通知文件系统过滤驱动智能卡已取出文件系统过滤驱动在处理这两种DCTL时,分别进行密钥相关数据结构的构造与删除。
5、特殊类型文件的处理
大部分的文件都可以通过在RPMJ-READ时进行解密,JRPMJWRrrE时进行加密的方式进行处理但对于一些特殊类型的文件如Micro softWord操作的文件(后缀名为doc)无法使用上述方法为了保证文件的可靠性,Micro soft Word在打开文件后会生成一个后缀名为tmp的临时文件,在文件关闭之前对文件的修改全部保存到此文件中当文件被关闭时,Micro softWord再将此临时文件重命名为后缀名为doc的文件名这就导致在处理RPMJ-WRITE时只能接收到后缀名为trnp文件的写操作,从而无法判断是否要对文件进行加密操作解决的方法是截获文件的重命名操作(在类型为JRPMJ-SET-N FORMAT DN的分发例程中处理),然后记录此文件重命名后的文件名,当此文件最终被关闭时,在RPMJ-CLOSE的分发例程中设置一个工作线程工作线程被调用时首先将原文件加密到一个临时文件,再将原文件删除,最后将临时文件重命名为原文件名。
基于文件系统过滤驱动技术的加密系统在实际的开发中,还要考虑很多其他问题如IRP的重入,过滤驱动的挂载与卸载等另外通过扩展使系统支持多种加密算法以及实现应用层的函数接口,可以使得应用层软件灵活方便地与系统进行集成,有助于系统的实际的应用。
小知识之过滤驱动
就是挂载在其他驱动上,对某设备的irp进行拦截过滤,可以对设备进行功能扩展,或是数据加密等,很灵活。