加密文件系统

加密文件系统（Encrypting File System，缩写EFS）是微软Windows在NTFS3.0中引入的一个功能，它提供文件系统级加密。此技术使文件支持加密以保护机密数据免受具有物理访问权限的攻击者侵害。

EFS从Windows 2000起在所有为商业环境开发的Windows版本中可用（见下方的“支持的操作系统”一节）。默认情况下，不会有文件被加密，但用户可以选择加密各文件、各文件夹和各驱动器。有些EFS设置可通过Windows域环境中的组策略强制执行。

其他操作系统也有提供的加密的文件系统，但微软EFS与它们不兼容。另见加密文件系统列表。

## 基本想法

很长一段时间以来，操作系统运行在一个没有文件加密的系统上，访问文件不得不只通过操作系统控制的用户身份验证和访问控制列表。如果攻击者取得了计算机的物理访问权，那么这些障碍都可以被轻易绕过。方法之一就是移除磁盘并将其放在另一个计算机中，用它的操作系统读取读取文件系统，或者从一个可引导光盘重启计算机来读取文件系统。

最广泛的可接受方案是将文件加密存储在物理介质上（磁盘、USB驱动器、磁带、光盘等）。

在微软Windows操作系统家族中，EFS可完成这项举措，尽管只能在NTFS驱动器上。它使用公钥加密算法和对称密钥加密的组合保证没有正确的密钥将极难解密文件。

但是，EFS的加密密钥在实践中使用用户帐户的密码保护，并因此容易受到大多数密码攻击。

## 操作

<image>

EFS使用对称密钥加密文件，这被称为文件加密密钥（File Encryption Key），简称FEK。使用对称加密算法是因为加密和解密大量数据时这比使用非对称密钥密码本消耗更少的时间。在不同的操作系统版本和配置上将使用不同的对称加密算法，见下面的Algorithms used by Windows version。FEK（用来加密文件的对称密钥）然后会使用一个与加密文件的用户相关联的公钥加密，加密的FEK将被存储在加密文件的$EFS可选数据流。要解密该文件，EFS组件驱动程序使用匹配EFS数字证书（用于加密文件）的私钥解密存储在$EFS流中的对称密钥。EFS组件驱动程序然后使用对称密钥来解密该文件。因为加密和解密操作在NTFS底层执行，因此它对用户及所有应用程序是透明的。

内容要被加密的文件夹会被文件系统标记为“加密”属性。EFS组件驱动程序会检查此“加密”属性，这类似NTFS中文件权限的继承：如果一个文件夹标记为加密，在里面创建文件和子文件夹就默认会被加密。在加密文件移动到一个NTFS卷时，文件会继续保持加密。但是，在许多情况下，Windows可能不需询问用户就解密文件。

被复制到部分文件系统（如通过第三方驱动挂载的 ext4）的文件和文件夹会被解密。最后，加密的文件使用SMB/CIFS协议通过网络复制时，文件在发送到网络前会被解密。

避免“复制时解密”的最有效方法是使用支持“原始数据”API的备份软件。使用 Raw API的备份软件会直接复制已加密文件的流和$EFS备用数据流为单个文件。换句话说，这些文件以加密形式被“复制”，备份过程中不牵扯解密。

从Windows Vista开始，用户的私钥可以存储在智能卡上；数据恢复代理（DRA）密钥也可以存储在智能卡上。

## 安全性

### 漏洞

在Windows 2000的EFS中存在两个重大安全漏洞。在那之后有遭遇不同程度的各种攻击。

#### 使用本地的Administrator帐户解密文件

在Windows 2000中，本地的administrator是默认的“数据恢复代理”，它可以解密任何本地用户用EFS加密的所有文件。在Windows 2000中的EFS在没有“恢复代理”时不能正常运作，所以始终有一个人可以解密用户已加密的文件。任何未加入域的Windows 2000计算机将容易受到未授权的EFS解密，任何能取得本地Administrator帐户权限的人都可以做到，而互联网上有许多工具可以做到这点。

在Windows XP及之后的版本中已经没有默认的“数据恢复代理”并且不再强制需要它。设置SYSKEY为模式2或3（在启动时键入syskey或插入相应软盘）将缓解未经授权的通过本地Administrator帐户解密的风险。这是因为本地用户密码进行了散列处理，存储在SAM文件中，并使用Syskey加密，而且Syskey的值对于无法接触Syskey口令/软盘的脱机攻击者不可用。

#### 通过密码重置访问私钥

在Windows 2000中，用户的RSA私钥只存储在“真正”的加密形式中，但用户的RSA私钥备份存在更脆弱的保护。如果攻击者能物理访问Windows 2000计算机并重置本地帐户的密码，攻击者可以登录为该用户（或恢复代理）并获得可解密所有文件的RSA私钥的权限。这是因为RSA私钥使用一个LSA私钥加密，而可提升登录到LocalSystem的攻击者可以访问它，获取相关工具并不困难。

在Windows XP及之后版本，用户的RSA私钥使用一个脱机公钥来备份，与该公钥对应的私钥存储在下列位置之一：密码重置磁盘（如果该Windows XP不是一个域成员），活动目录（如果该Windows XP是一个域的成员）。这意味着可以通过Windows XP本地系统身份验证的攻击者仍无法访问存储在PC硬盘上的解密密钥。

在Windows 2000、XP或更新版本中，用户的RSA私钥使用用户的NTLM密码散列加用户名散列来加密——加盐的散列使得在未获知用户密码的情况下，很难逆转此过程并得出用户的私钥。同样，将系统模式设置为模式2或模式3（在启动时键入或通过软盘提供系统密钥）将缓解此攻击，因为本地用户的密码散列存储在SAM文件中。

### 其他问题

一旦用户已成功登录，访问他的EFS加密文件的请求都不会要求身份验证，解密会静默、透明完成。因此，任何被攻破的用户密码都将自动允许访问数据。Windows可以使用可逆加密存储用户帐户密码，不过这已不是默认情况；它还可以配置为存储本地用户帐户密码的Lan管理器散列，并且这在Windows XP和更早版本的原版中是默认行为，这可以被攻击和更容易攻破。它还存储本地用户帐户密码的NTLM散列，如果密码较弱，这可能使用“彩虹表”轻易攻破（Windows Vista和之后版本默认不允许弱密码）。为了避免本地密码遭受暴力破解，旧版本的Windows应该配置为永不存储LM散列（在组策略的安全设置部分），当然，更不能启用自动登录（那会在注册表中存储明文密码）。此外，使用超过14个字符的本地用户帐户密码可避免Windows在SAM中存储LM散列——以及加强对NTLM散列的暴力攻击的抵抗性。

当使用EFS加密文件时，即将明文文件转换为加密文件时，明文文件并不会被擦除，而只是被标记为已删除（即在文件系统中标记为“未使用”数据）。这意味着，除非它恰好存储在一个支持TRIM的SSD上，从而（或者因其他设定）被尽快覆盖，否则会容易找回它们。为充分减少对EFS这个已知的、非技术性的问题，你应该在文件夹级别配置加密（以便使在这些文件夹中创建文件时即被加密，而不是被移动和留下一份明文文件的残留）。当想要加密单个文件时，加其复制到一个加密的文件夹或者加密的文件中，然后有效地擦除原存储卷。用户可以使用Windows Cipher实用工具（配以/W选项）或其他工具来有效擦除磁盘上的可用空间。

任何可以取得管理员权限的人都可以覆盖、更改Data Recovery Agent的配置。这是一个非常严重的问题，因为攻击者可能侵入管理员帐户并将精心设计的任何DRA证书设置为数据恢复代理，并等待。这有时被称为双阶段攻击（two-stage attack），其与PC遗失或被盗的风险显著不同，更突出内部的恶意人士所产生的风险。

当用户在这种攻击的第一阶段后对文件加密时，将自动使用指定的DRA公钥加密FEK。攻击者只需要以管理员身份访问此计算机，就能对随后使用EFS加密的文件进行完全访问。即使已使用Syskey模式2或模式3，也并不能防止这种攻击，因为攻击者可以将加密文件脱机备份并还原到其他地方，然后使用DRA的私钥解密文件。当然，如果有恶意人员可以物理访问计算机，那么您也可以考虑所有的安全功能都将失效，因为他们也可以在计算机上安装Rootkit、特殊软件，或者硬件键盘记录器等。在恶意攻击中，这可能比覆盖DRA策略更为有效和全面。

### 恢复

使用EFS加密的文件只能使用匹配之前所用公钥的RSA私钥解密。用户的私钥副本本质上是使用用户的登录密码保护。从Windows外的其他操作系统（比如Linux）访问加密的文件是不可能的——不只是因为目前没有第三方的EFS组件驱动程序。此外，使用特殊工具重置用户的登录密码以解密用户的私钥和访问用户的加密文件也是不可能的。这也意味着用户有可能导致数据丢失，如果用户忘记了自己的密码并且没有备份加密密钥。这成就了一个术语——“延迟的回收站”，它表示没有经验的用户使用此功能加密文件似乎会不可避免的在未来遇到数据丢失。

如果EFS配置为使用一个公钥基础设施签发的密钥，并且PKI配置为启用“密钥存档和恢复”，可以先恢复私钥文件，然后恢复加密文件。

### 密钥

- 用户密码（或智能卡私钥）：用于生成解密密钥以解密用户的DPAPI主密钥
- DPAPI主密钥：用于解密用户的RSA私钥
- RSA私钥：用于解密每个文件的FEK
- 文件加密密钥（FEK）：用于解密/加密每个文件的数据（NTFS主要流）
- SYSKEY：用于加密缓存的域验证和存储在SAM中的密码散列值
- 搜寻加密档案位置(C:表示硬盘代号,变更代号可搜寻其他硬盘）

请在Windows PowerShell下执行指令

```powershell
Get-ChildItem C:\ -Recurse -Force -ErrorAction SilentlyContinue | Where-Object {$_.Attributes -ge "Encrypted"} | Format-List fullname, attributes
```

## 支持的操作系统

### Windows

- Windows 2000专业版、服务器版、高级服务器版和数据中心版
- Windows XP专业版、Tablet PC版、媒体中心版和x64版本
- Windows Server 2003和Windows Server 2003 R2，包括x86和x64版本
- Windows Vista商业版、企业版和旗舰版
- Windows 7专业版、企业版和旗舰版
- Windows Server 2008和Windows Server 2008 R2
- Windows 8和8.1专业版和企业版
- Windows Server
- Windows 10专业版、企业版和教育版，在家庭版中不可用。

### 其他操作系统

没有其他操作系统或文件系统原生支持EFS。

## 各Windows版本可用的新功能

Windows XP

- 客户端侧缓存（脱机文件数据库）加密
- 使用广域公钥保护DPAPI主密钥备份
- 自动注册用户证书（包括EFS证书）
- 多用户（共享）访问加密文件（在文件的基础上），在共享加密文件时检查证书吊销
- 加密文件可以用另一种颜色显示（默认绿色）
- 不再需要强制性的“恢复代理”
- 文件移动到不支持的文件系统而可能静默解密时警告
- 密码重置盘
- EFS通过WebDAV，远程加密Active Directory委派的服务器

Windows XP SP1

- 支持并默认对所有EFS加密的文件使用AES-256对称加密算法

Windows XP SP2 + KB 912761

- 防止注册自签名的EFS证书

Windows Server 2003

- 数字身份管理服务
- 强制执行RSA密钥最小长度设置，对于注册自签名EFS证书

Windows Vista和Windows Server 2008

- 客户端侧缓存（脱机文件）分用户加密
- 支持在一个PC/SC智能卡上存储用户或DRA（数据恢复）RSA私钥
- EFS密钥更新向导
- EFS密钥备份提示
- 支持从PC/SC智能卡派生DPAPI主密钥
- 支持加密pagefile.sys
- 使用BitLocker（Windows Vista企业版或旗舰版提供）保护EFS相关的私密信息
- “文档”文件夹的加密
- 脱机文件加密
- 加密文件的索引
- 使用EFS需要智能卡
- 从智能卡创建一个可缓存的用户密钥
- 用户密钥创建时显示密钥备份通知
- 指定自动注册EFS证书时使用的证书模板

Windows Server 2008

- 在Windows Server 2008服务器上注册的EFS自签名证书将默认使用2048位RSA密钥长度
- 所有EFS模板（用户和恢复代理证书）默认使用2048位RSA密钥长度

Windows 7和Windows Server 2008 R2

- 椭圆曲线密码学（ECC）。Windows 7支持ECC和RSA算法的混合操作模式保证向后兼容
- EFS自签名证书在使用ECC时将默认使用256位密钥。
- EFS在使用自签名RSA证书时可以配置为使用1K/2k/4k/8k/16k位密钥，使用ECC证书时可以使用256/384/512位密钥。

## 各Windows版本使用的算法

Windows EFS支持一系列对称加密算法，加密文件时使用的算法取决于Windows版本：

操作系统｜默认算法｜其他算法

Windows 2000｜DESX｜（无）

Windows XP RTM｜DESX｜三重DES

Windows XP SP1｜AES｜Triple DES、DESX

Windows Server 2003｜AES｜Triple DES、DESX

Windows Vista｜AES｜Triple DES、DESX

Windows Server 2008｜AES｜Triple DES、DESX (?)

Windows 7 Windows Server 2008 R2｜混合（AES、SHA和ECC）｜Triple DES、DESX