开发者社区> 余二五> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

深入剖析EFS

简介:
+关注继续查看
[摘要]EFS是Encrypting File System,加密文件系统的缩写。本文详细介绍了EFS的加密方法及其原理。
创建时间:2005-06-01 更新时间:2005-06-03
文章属性:原创
文章提交:mrcool (mrcool_at_zhinet.com)

EFS是Encrypting File System,加密文件系统的缩写,他可以被应用在windows 2000以上的操作系统且为NTFS5格式的分区上(windows xp home不支持).
    
    EFS 只能对存储在磁盘上的数据进行加密,是一种安全的本地信息加密服务.EFS使用核心的的文件加密技术在NTFS卷上存储加密文件.
    它可以防止那些未经允许的对敏感数据进行物理访问的入侵者(偷取笔记本电脑,硬盘等)
    
    EFS是如何工作的

    当一个用户使用EFS去加密文件时,必须存在一个公钥和一个私钥,如果用户没有,EFS服务自动产生一对。对于初级用户来说,即使他完全不懂加密,也能加密文件,可以对单个文件进行加密,也可以对一个文件夹进行加密,这样所有写入文件夹的文件将自动被加密。

    一旦用户发布命令加密文件或试图添加一个文件到一个已加密的文件夹中,EFS将进行以下几步:

    第一步:NTFS首先在这个文件所在卷的卷信息目录下(这个目录隐藏在根目录下面)创建一个叫做efs0.log的日志文件,当拷贝过程中发生错误时利用此文件进行恢复。

    第二步:然后EFS调用CryptoAPI设备环境.设备环境使用Microsoft Base Cryptographic Provider 1.0 产生密匙,当打开这个设备环境后,EFS产生FEK(File Encryption Key,文件加密密匙).FEK的长度为128位(仅US和Canada),这个文件使用DESX加密算法进行加密。

    第三步: 获取公有/私有密匙对;如果这个密匙还没有的话(当EFS第一次被调用时),EFS产生一对新的密匙.EFS使用1024位的RSA算法去加密FEK.

    第四步:EFS为当前用户创建一个数据解密块Data Decryptong Field(DDF),在这里存放FEK然后用公有密匙加密FEK.


    第五步:如果系统设置了加密的代理,EFS同时会创建一个数据恢复块Data Recovery Field(DRF),然后把使用恢复代理密匙加密过的FEK放在DRF.每定义一个恢复代理,EFS将会创建一个Data Recovery Agent(DRA).Winxp没有恢复代理这个功能,所以没有这一步.,这个区域的目的是为了在用户解密文件的中可能解密文件不可用。这些用户叫做恢复代理,恢复代理在EDRP(Encryption Data Recovery Policy,加密数据恢复策略)中定义,它是一个域的安全策略。如果一个域的EDRP没有设置,本地EDRP被使用。在任一种情况下,在一个加密发生时,EDRP必须存在(因此至少有一个恢复代理被定义)。DRF包含使用RSA加密的FEK和恢复代理的公钥。如果在EDRP列表中有多个恢复代理,FEK必须用每个恢复代理的公钥进行加密,因此,必须为个恢复代理创建一个DRF。

    第六步:包含加密数据、DDF及所有DRF的加密文件被写入磁盘。

    第七步: 在加密文件所在的文件夹下将会创建一个叫做Efs0.tmp的临时文件.要加密的内容被拷贝到这个临时文件,然后原来的文件被加密后的数据覆盖.在默认的情况下,EFS使用128位的DESX算法加密文件数据,但是Windows还允许使用更强大的的168位的3DES算法加密文件,这是FIPS算法必须打开,因为在默认的情况下它是关闭的.

    第八步:在第一步中创建的文本文件和第七步中产生的临时文件被删除。

    加密过程图片可参考 [url]http://www.ntfs.com/images/encryption.gif[/url] 

    文件被加密后,只有可以从DDF或是DRF中解密出FEK的用户才可以访问文件.这种机制和一般的安全机制不同并意 味着要想访问文件,除了要有访问这个文件的权力外还必须拥有被用户的公有密匙加密过的FEK.只有使用私有密匙解密文件的用户才可以访问文件.这样的话会有一个问题:就是一个可以访问文件的用户可把文件加密之后,文件真正的拥有者却不能访问文件.解决这个问题的办法:用户加密文件的时候只创建一个文件解密块Data Decryption Field(DDF),但是只后他可以增加附加用户到密匙队列.这种情况下,EFS简单地把FEK用想给其他用户访问权的用户的私有密匙加密.然后用这些用户的公有密匙加密FEK,新增加的DDF和第一个DDF放在一起(这些新增加的用户对文件只有访问的权力).

    解密的过程和加密的过程是相反的,参考[url]http://www.ntfs.com/images/decryption.gif[/url]

    首先,系统检测用户是否具有被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的数量决定的.
    
    [url]http://www.ntfs.com/images/efs_header.gif[/url]
    
    下面是一个详细的EFS属性的例子.
    
    [url]http://www.raid1.cn/efs/pic/attribute/EFS_example.gif[/url]
    
    紫色: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),私有密匙全局唯一标识符并不是保存所有的用户,其它的必须从基于公有密匙存储特性的证书中恢复.

    红色:加密提供器的名字(Microsoft Base Cryptographic Provider v.1.0)

    绿色:用户的名称,DDF和DRF的所有者.

    蓝色:加密后的FEK.通常FEK是128位的,但是被1024位的RSA密匙加密后,长度变成1024位.









本文转自 张宇 51CTO博客,原文链接:http://blog.51cto.com/zhangyu/33874,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载