![在另一台电脑上访问 Windows 加密文件](https://linux22.com/image/1461086/%E5%9C%A8%E5%8F%A6%E4%B8%80%E5%8F%B0%E7%94%B5%E8%84%91%E4%B8%8A%E8%AE%BF%E9%97%AE%20Windows%20%E5%8A%A0%E5%AF%86%E6%96%87%E4%BB%B6.png)
我是新手WINDOWS EFS我发现它非常有用,但有一个问题,无法在另一台 Windows PC 上访问这些文件。我找到了一些关于如何在其他 Windows PC 上访问它们的教程(1,2)阅读之后,我有几个问题:
- 将加密密钥导入到其他电脑以访问该电脑中的加密文件后,密钥会永远存储在该系统中吗?
- 如果上述情况属实,那么他们之后还能访问我提供给他们的其他加密文件吗?
答案1
将加密密钥导入到其他电脑以访问该电脑中的加密文件后,密钥会永远存储在该系统中吗?
嗯,只要他们的 Windows 帐户存在,只要他们不存在删除密钥(例如通过证书管理器certmgr.msc
)。除此之外,它没有任何自毁日期。
如果上述情况属实,那么他们之后还能访问我提供给他们的其他加密文件吗?
是的。(所以,一般来说,把自己的 EFS 密钥交给别人是相当愚蠢的。)
相反,请记住这些密钥就像 SSL 证书,有一半是公开的,一半是私有的。在属性 → 高级有一个所有有权访问的用户列表。因此,你可以导入其他人的民众密钥(证书),并将其添加到文件列表中。
答案2
EFS 旨在保护文件免遭未经授权的用户可以读取硬盘的访问,例如:
- 可以更改 ACL 权限的管理员组成员,或
- 具有计算机物理访问权限的人员移除磁盘并将其安装到另一台他们可以完全控制的计算机上
在独立安装中,当用户加密第一个文件时,Windows 会自动生成自签名 EFS 证书。默认情况下,这是唯一可以解密文件的私钥。依赖 EFS 的用户应该始终:
- 导出其 EFS 证书(包括私钥)并将其存储在安全的位置,或者
- 将其文件备份到未使用相同 EFS 密钥加密的目的地(例如,备份到闪存驱动器)不是加密)
原始问题已经引用了导出和导入用户 EFS 证书的指南。在此答案中,我们仅重申 EFS 使用存储在用户个人证书存储中的证书加密文件:
注意:在企业环境中,通常使用组策略对象设置指定“数据恢复代理”(DRA) 证书。指定 DRA 证书后,会添加加密文件。这样可以使用原始 EFS 证书私钥或 DRA 私钥解密文件。在独立环境中,这也是可能的,但并不常见。
Windows 操作系统将用户的 EFS 证书以受保护的形式存储在该用户的配置文件目录中。如果满足以下条件,使用一些专门的工具可以相对容易地恢复此密钥:
- 可以访问用户的个人资料目录(通常为
C:\Users\<Username>
) - 用户的登录密码已知
您需要的工具包括:
mimikatz
命令行实用程序来提取密钥(从发布页面)OpenSSL
命令行实用程序来构建 EFS 证书(从下载最新的 Windows 二进制文件slproweb.com)
在下面的步骤中,我们假设加密文件的用户的配置文件目录位于D:\Backup\Users\John Citizen
。
步骤 1:找出用于加密文件的证书
我们将打开命令提示符并使用 Windows 内置的“密码”实用程序。
(注意:第一行是必须执行的命令;以下几行显示命令的输出。)
cipher /c my_encrypted_file.docx
...
Users who can decrypt:
John Citizen [xxxxxx]
Certificate thumbprint: 9556 EAC7 EEE6 46DF 9453 63A7 F90B 3E3C F69E D981
...
第 2 步:导出公钥并确定私钥的位置
我们将使用前面的指纹导出公钥并找到私钥。在命令提示符窗口中,启动mimikatz
并执行以下步骤。
mimikatz # crypto::system /file:"D:\Backup\Users\John Citizen\AppData\Roaming\Microsoft\SystemCertificates\My\Certificates\9556EAC7EEE646DF945363A7F90B3E3CF69ED981" /export
...
[0002/1] KEY_PROV_INFO_PROP_ID
Provider info:
Key Container : 63d5bb1c-3461-4af2-982e-7034ef01479a
Provider : Microsoft Enhanced Cryptographic Provider v1.0
Provider type : RSA_FULL (1)
Type : AT_KEYEXCHANGE (0x00000001)
Flags : 00000000
Param (todo) : 00000000 / 00000000
...
这会将公钥保存到9556EAC7EEE646DF945363A7F90B3E3CF69ED981.der
。输出还告诉我们私钥存储在 Microsoft Enhanced Cryptographic Provider v1.0 容器 中63d5bb1c-3461-4af2-982e-7034ef01479a
。
步骤3:找到私钥容器
mimikatz # dpapi::capi /in:"D:\Backup\Users\John Citizen\AppData\Roaming\Microsoft\Crypto\RSA\<__USER_SID__>\<YYYY>"
...
**KEY (capi)**
dwVersion : 00000002 - 2
dwUniqueNameLen : 00000025 - 37
dwSiPublicKeyLen : 00000000 - 0
dwSiPrivateKeyLen : 00000000 - 0
dwExPublicKeyLen : 0000011c - 284
dwExPrivateKeyLen : 0000064e - 1614
dwHashLen : 00000014 - 20
dwSiExportFlagLen : 00000000 - 0
dwExExportFlagLen : 000000fc - 252
pUniqueName : 63d5bb1c-3461-4af2-982e-7034ef01479a <<< MATCHES VALUE FROM STEP 1
...
**BLOB**
dwVersion : 00000001 - 1
guidProvider : {df9d8cd0-1501-11d1-8c7a-00c04fc297eb}
dwMasterKeyVersion : 00000001 - 1
guidMasterKey : {e5cfe43c-d545-44c3-9bd7-da3ffc2013a0} <<< ID OF THE MASTERKEY
您可能需要尝试文件夹内的多个文件夹/文件,直到找到与密钥容器值相等的Crypto\RSA
私钥pUniqueName
步骤1以 开头的行guidMasterKey
告诉我们用于加密私钥的主密钥的 ID(在本例中为e5cfe43c-d545-44c3-9bd7-da3ffc2013a0
)。
步骤 4:获取主密钥
在此步骤中,我们将需要用户的登录密码。
(如果我们没有,那么仍然有选择,但它们超出了这个答案的范围。)
dpapi::masterkey /in:"D:\Backup\Users\John Citizen\AppData\Roaming\Microsoft\Protect\<__USER_SID__>\e5cfe43c-d545-44c3-9bd7-da3ffc2013a0" /password:<__USERLOGONPASSWORD__>
...
[masterkey] with password: <__USERLOGONPASSWORD__> (normal user)
key : <__MASTERKEY__>
sha1: 1b9f5ce5543a42b9933f26bbb7b7dd83d7929ee1 <<< HASH OF THE MASTERKEY
...
步骤5:解密私钥
mimikatz # dpapi::capi /in:"D:\Backup\Users\John Citizen\AppData\Roaming\Microsoft\Crypto\RSA\__USER_SID__\<YYYY>" /masterkey:1b9f5ce5543a42b9933f26bbb7b7dd83d7929ee1
...
Key size : 2048
Private export : OK - 'raw_exchange_capi_0_63d5bb1c-3461-4af2-982e-7034ef01479a.pvk'
...
步骤 6:创建证书文件
在此步骤中,我们将从步骤 1 中获得的公钥文件和步骤 4 中获得的私钥文件创建一个 PFX 证书文件。
openssl x509 -inform DER -outform PEM -in 9556EAC7EEE646DF945363A7F90B3E3CF69ED981.der -out public.pem
openssl rsa -inform PVK -outform PEM -in raw_exchange_capi_0_63d5bb1c-3461-4af2-982e-7034ef01479a.pvk -out private.pem
openssl pkcs12 -in public.pem -inkey private.pem -password pass:<__NEW_PASSWORD_TO_PROTECT_THIS_PFX_FILE__> -keyex -CSP "Microsoft Enhanced Cryptographic Provider v1.0" -export -out my_efs_certificate.pfx
这将生成一个名为的 PFX 证书文件my_efs_certificate.pfx
。
步骤 7:导入 PFX 证书
使用以下任一方法导入 PFX 证书:
打开证书管理单元(
certmgr.mmc
;请参阅此答案顶部的屏幕截图)。右键单击该Personal\Certificates
文件夹并选择进口。双击 PFX 文件。
使用 Windows 内置
certutil
命令行实用程序:
certutil -user -p mimikatz -importpfx my_efs_certificate.pfx NoChain,NoRoot
瞧!您现在应该能够访问使用此用户的 EFS 证书加密的文件。