加密文件系統

加密文件系統（Encrypting File System，縮寫EFS）是微軟Windows在NTFS3.0中引入的一個功能，它提供文件系統級加密。此技術使文件支持加密以保護機密數據免受具有物理訪問權限的攻擊者侵害。

EFS從Windows 2000起在所有為商業環境開發的Windows版本中可用（見下方的「支持的作業系統」一節）。默認情況下，不會有文件被加密，但使用者可以選擇加密各文件、各文件夾和各驅動器。有些EFS設置可通過Windows域環境中的組策略強制執行。

其他作業系統也有提供的加密的文件系統，但微軟EFS與它們不兼容。另見加密文件系統列表。

## 基本想法

很長一段時間以來，作業系統運行在一個沒有文件加密的系統上，訪問文件不得不只通過作業系統控制的使用者身份驗證和訪問控制列表。如果攻擊者取得了電腦的物理訪問權，那麼這些障礙都可以被輕易繞過。方法之一就是移除磁碟並將其放在另一個電腦中，用它的作業系統讀取讀取文件系統，或者從一個可引導光碟重啟電腦來讀取文件系統。

最廣泛的可接受方案是將文件加密存儲在物理介質上（磁碟、USB驅動器、磁帶、光碟等）。

在微軟Windows作業系統家族中，EFS可完成這項舉措，儘管只能在NTFS驅動器上。它使用公鑰加密演算法和對稱密鑰加密的組合保證沒有正確的密鑰將極難解密文件。

但是，EFS的加密密鑰在實踐中使用使用者帳戶的密碼保護，並因此容易受到大多數密碼攻擊。

## 操作

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