计算机已成为现代人类生活、办公等必不可少的设备之一。我们会把重要信息以文件的形式存储在计算机中,所以就需要对这些文件进行加密保护。目前的加密方法很多,但大部分都是用户态的密码加密,操作繁琐且加密效果不理想。本文介绍了两种区别于前者的透明加密方法:钩子透明加密和过滤驱动透明加密,并对梁两种方法进行了比较。
一 文件透明加密技术简介
文件透明加密技术是近些年针对企业文件保密需求应运而生的一种文件加密技术,区别于常见的文件密码加密。所谓透明,是指对用户而言加密解密过程不会被察觉,当用户打开或编辑受保护文件时,系统将自动对未加密的文件进行加密,对已加密的文件解密。文件在硬盘上以密文形式存储,在内存中则为明文。一旦改变使用环境,由于无法获得自动解密服务而无法打开,从而达到保护文件内容的目的。
透明加密解密技术是与操作系统紧密结合的一种技术,Windows允许程序设计人员在内核和用户两个级别操作文件。因此,加密进程就可以在这两个层次截获文件读写操作,嵌入自己的加密算法进行加解密,通过应用级的截获采用API HOOK(俗称钩子)技术,成为钩子透明加密。内核级采用文件过滤驱动,称驱动加密。两者的加密层次如下图所示。
1 钩子透明加密技术
早期的透明加密的技术手段大多是通过API 钩子技术进行,其工作方式为静态加密和重定向,基本思想为钩子程序拦截到受保护文件的打开操作,先将已加密的文件拷贝到一个临时目录中,然后告诉驱动程序把这个文件隐藏起来,然后解密这个文件,并将这个临时文件返回给打开文件的进程,这样打开的就是磁盘上的一个明文文件,用户程序可以进行正常的处理,这里文件是进行了整体的拷贝并解密;在文件关闭时,钩子拦截到以后,将那个明文的临时文件加密,然后再拷贝回来覆盖掉原文件。
简单的讲,就是打开文件时,将加密文件的副本拷贝到隐蔽位置,然后把这个文件解密、打开,保存时再把临时文件加密后覆盖原文件。这种加密实质上是通过临时文件来实现的,为了确保明文和密文之间的一致性,必须在每次用户存盘或者系统自动存盘的时候,对整个文件进行一次整体加密和并复制到用户文件原来存储的位置,因此效率较低,且由于在计算机上保存了完整的明文文件,只要跟踪到临时文件所在位置即可能泄密,此外,文件在打开和存储过程中需要多次复制,效率损失很大,Hook API 的方式对于一些程序不能够完美的支持,兼容性有待考证。
由于文件映射的存在,在应用层进行动态加密比较困难,虽然原理上有一定的可行性,但是其加密效率、兼容性、可移植性、稳定性较之于内核层的过滤驱动加密要差很多,好处在于开发难度较小, 网络操作能力强。
2 过滤驱动透明加密技术
2.1 驱动技术简介
过滤驱动加密技术是基于Win2dows 的文件系统过滤驱动( IFS) 技术,工作在Windows 的内核层。它是目前炙手可热的一门技术,其特点是技术门槛较高,需要深入理解Win2dows 系统内核,开发过程中稍有不慎就会破坏系统内核,因此核心技术仅被少数几家实力雄厚的公司所掌握。
文件过滤驱动是把文件作为一种设备来处理的一种虚拟驱动,Windows NT 系统内核采用堆栈式可扩展驱动模型[1 ] ,原则上可以在任何一个层次上加载自己的过滤驱动,但是加载的层次不同,开发的难度和应用价值也不同,现在的技术主要还是加载在文件系统驱动的上层,这样就可以充分利用并扩充文件系统的现有功能,该技术在病毒实时监控与防护、数据备份与还原以及文件访问控制等领域都有着非常广泛的应用。
过滤驱动中几种非常重要的概念包括驱动对象、设备对象、设备堆栈、I/ O 堆栈,驱动对象标示驱动程序,设备对象记录加载的设备,一个驱动对象可以有多个设备对象构成设备对象链表,设备堆栈用于记录所有驱动程序的设备, I/ O 栈用来记录穿越设备堆栈时的操作属性, 操作的对象为IRP ( I/ O Request Pack2age) , IRP 包由系统的某个组件创建,类似于Windows应用程序的“消息”概念,要处理某种数据只需要把IRP 包传送到相应驱动的相应派遣函数中。
2.2 加密的基本思想
在Windows NT 内核操作系统中,应用程序的一次数据请求的过程如图2 所示[4 ] :只有在无缓存或者FAST I/ O 不可用的情况下才在硬盘上读取数据,因此只用拦截IRP —> Flags 为IRP- NOCACHE(表示I/O 请求从存储的媒介而不是高速缓存中读取数据) 、IRP- PAGING- IO(表示此时执行内存页的I/ O 操作)和IRP- SYNCHRONOUS- PAGING- IO(表示内存页需要同步更新,此标志也是由内存管理器使用) 的数据包,对于写数据的IRP 包,在其分发例程中嵌入加密算法完成加密动作,而对于读数据的IRP 包,在IRP包的完成例程中嵌入解密算法,对得到的数据进行解密处理。
2.3 写数据加密的实现
在用户写受保护的文件时,文件加解密客户端能透明地对文件写入的内容进行加密。加密文件判别模块判别出此文件为受保护文件后,将密钥传递给加解密过滤驱动,并由过滤驱动完成写操作。为了使过滤驱动能够加密对文件的写操作,需要拦截IRP- MJ -WRITE 和IRP- MJ - DEVICE- CONTROL 两种IRP。当应用层进程调用API :DeviceIOControl 时,向系统发出IRP- MJ - DEVICE- CONTROL ,过滤驱动可以通过处理此IRP 获得传递给驱动的加密密钥,进而在拦截IRP- MJ - WRITE 的例程中进行加密。
2.4 读数据解密的实现
在用户读受保护的文件时,文件加解密客户端能透明地对读出的原始内容进行解密。加密文件判别器判别出此文件为受保护文件后,将密钥传递给加解密过滤驱动,并由过滤驱动完成读操作。和写操作类似,需要拦截IRP- MJ - WRITE 和IRP- MJ - DEVICECONTROL两种IRP。IRP- MJ - DEVICE- CONTROL例程的用途和实现方式和加密时相同。过滤驱动拦截IRP- MJ - READ 的例程中进行加密。IRP- MJ - READ例程的实现需要利用完成例程,在完成例程中完成加解密过程。
二 两种加密技术比较
以上两种加密技术由于工作在不同的层面,从应用效果、开发难度上各有特点。表1 从各方面进行了简单比较。
三 小结
钩子透明加密和过滤驱动加密是目前两种主流的透明加密方法,二者的区别在于截获文件操作的位置不同,比较而言过滤驱动加密效果更好,但是实现的难度也相当的大,在安全领域具有很高的研究价值和实用价值。