深入剖析EFS
解密的过程和加密的过程是相反的,参考/Article/UploadFiles/200603/20060323141326836.gif
首先,系统检测用户是否具有被EFS使用的私有密匙.如果有的话,系统将会在读取EFS属性,同时在DDF对列中寻找当前用户的DDF.如果DDF找到的话,用户私有密匙将会在那里解密出FEK.使用解密出来的FEK,EFS去解密加密的文件数据.需要注意的是文件从来不会完全被加密,但是有时候会去加密一些特殊的扇区如果上层模块要求的话.
EFS组成
EFS由EFS服务、EFS驱动、EFS文件系统运行库(FSRTL)和Win32 API。EFS服务作为一个标准系统服务运行,它是Windows 2000安全子系统的一部分。它与CryptoAPI接口产生钥匙、DDF和DRF,EFS驱动就象是NTFS的一部分,它呼叫EFS服务请求钥匙,DDF和DRF作为需要被创建,一个EFS驱动的组成是EFS FSRTL,它定义了EFS驱动程序能作为NTFS的代表而执行的功能。
EFS和NTFS如何共存
EFS可以被认为除NTFS外的第二层防护,为访问一个被加密的文件,用户必须有访问到文件的NTFS权限。在相关NTFS权限的用户能看到文件夹中的文件,但不能打开文件除非有相应的解密钥匙。同样,一个用户有相应的钥匙但没有相应的NTFS权限也不能访问到文件。所以一个用户要能打开加密的文件,同时需要NTFS权限和解密钥匙。
然而,NTFS权限可能被大量的方法穿越,包括口令破解程序、用户在离开前没有退出系统或系统内部的NTFSDOS。在NT4.0下,游戏结束了――硬盘上所有的数据都可以访问了。在Windows 2000下,当一个文件用EFS加密后,一个未授权的用户,即使访问到磁盘上的文件,但也不能访问文件上数据,因为没有授权用户的私钥。
EFS 属性 当NTFS加密文件的时候,它首先会为文件设置加密标志,然后在存储DDF和DDR的地方为文件创建一个$EFS属性.这个属性的属性ID=0x100,它可以被加长,占有0.5k到若干k的大小,这个大小是由DDF和DRF的数量决定的. /Article/UploadFiles/200603/20060323141327932.gif
下面是一个详细的EFS属性的例子.
紫色:EFS属性大小 天蓝色:电脑安全标识符和用户数字.它指定EFS存储证书的文件夹.为了得到文件 夹的名字,EFS会做一些转换.
5A56B378 1C365429 A851FF09 D040000 - 存储在$EFS中的数据.
78B3565A 2954361C 09FF15A8 000004D0 - 转换后的结果.
2025018970-693384732-167712168-1232 - 转换成十进制.
S-1-5-21-2025018970-693384732-167712168-1232 - 加上安全标识符前缀.
得到的文件夹就是:
%UserProfile%\ApplicationData\Microsoft\Crypto\RSA\S-1-5-21-2025018970-693384732167712168-1232\
粉红色:公有密匙特性
黄色:私有密匙全局唯一标识符(同时被当作容器名字).当EFS从CryptoAPI provider中获取设备环境的时候使用这个名字.如果$EFS属性只有一个DDF,容器的名字可以从$efs中计算出来.但是当更多的用户加入这个文件的时候(就会有更多的DDF和DRF),私有密匙全局唯一标识符并不是保存所有的用户,其它的必须从基于公有密匙存储特性的证书中恢复.
|