我正在测试将.net v4的System.Security.Cryptography.ProtectedData()和UnprotectData()方法与DataProtectionScope.LocalMachine范围一起使用的想法,以确保只能在单台计算机上对文件进行加密/解密。这是我正在做的一般想法...

//Encrypt
byte[] outBytes = ProtectedData.Protect(File.ReadAllBytes(fileIn), null, DataProtectionScope.LocalMachine);
File.WriteAllBytes(fileOut, outBytes);

//Decrypt
byte[] outBytes = ProtectedData.Unprotect(File.ReadAllBytes(fileIn), null, DataProtectionScope.LocalMachine);
File.WriteAllBytes(fileOut, outBytes);

我已经做了大量的测试,以确保在执行此操作时能达到预期的行为,并且它似乎可以正常工作,因为同一台计算机上的任何用户都可以使用上面列出的方法调用来加密/解密文件。

我的问题是,如果有人制作了包含使用此机制加密的文件的系统的磁盘镜像或克隆(使用Acronis,Ghost等),然后将该镜像还原到另一台计算机上,该怎么办? (一个示例是,IT部门预先加载了一个系统,然后该系统成为具有相同硬件配置的大量机器的基础镜像)。在不同硬件上还原的OS是否能够解密在“原始”系统上加密的文件?我的希望是,由于硬件不同,解密将失败,但是如果在注册表或文件系统中存在执行加密所需的所有必要信息,那将是有道理的。

显然,我可以自己测试一下,但是我现在真的没有足够的资源来进行测试,并且一直在不停地搜索以查看是否有人已经知道答案了。任何建议,不胜感激!

最佳答案

我的答案仅适用于DataProtectionScope.LocalMachine,因为显然DataProtectionScope.CurrentUser使用存储在Active Directory或某些其他漫游源中的 key ,并且是明确设计的,而不是绑定(bind)到单个物理 key 。

LocalMachine而言,计算机的克隆将能够打开相同的文件,因为计算 secret 钥存储在计算机的硬盘上,并且是通过安装Windows的“sysprep”阶段生成的(这就是公司Windows的原因。首次展示可以使用相同的系统镜像,但是只要它们运行sysprep,则每个系统都将拥有自己的 key )。

计算机可以重新创建其机器 key (并且还可以保留旧 key ,因此旧数据仍然可以解密)。我不知道如何获取它来重新创建 key ,然后删除旧 key 。

资料来源:http://www.windows-server-answers.com/microsoft/Security-Cryptography/30350079/local-machine-masterkey-in-dpapi.aspx

关于.net - DPAPI和ProtectedData.Protect()如何处理.net 4中的磁盘镜像/克隆?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13651725/

10-11 00:10