我正在测试使用.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部门预先加载单个系统,然后成为具有相同硬件配置的大量机器的基本映像)。在不同的硬件上恢复的操作系统是否能够解密在“原始”系统上加密的文件?我希望由于硬件不同,解密会失败,但如果在注册表或文件系统中存在加密所需的所有必要信息,那么它可能会有效。
显然,我可以为自己测试一下,但我现在并没有真正有资源这么做,并且一直在不停地搜索,看看那里的其他人是否已经知道答案。任何建议都非常感谢!
答案 0 :(得分:4)
我的回答仅适用于DataProtectionScope.LocalMachine
,因为显然DataProtectionScope.CurrentUser
使用存储在Active Directory或其他漫游源中的密钥,并且明确地,按照设计,不依赖于单个物理密钥。
就LocalMachine
而言,计算机的克隆将能够打开相同的文件,因为机器密钥存储在计算机的HDD上,并使用安装Windows的“sysprep”阶段生成(这就是企业Windows部署可以使用相同系统映像的原因,但只要它们运行sysprep,每个系统都有自己的密钥)。
计算机可以重新创建其机器密钥(它还可以保留旧密钥,因此旧数据仍然可以解密)。我不知道如何让它重新创建密钥然后删除旧密钥。
答案 1 :(得分:0)
好问题 - 围绕它寻找主键似乎每隔一天自动重新生成。 90天。 Passcape.com上有一个非常好的analysis - DPAPI安全的核心是系统的SYSKEY,它存储在SYSTEM配置单元下的注册表中。
因为可以apparently使用带有CRYPT_PROTECT_REGENERATE标志的CryptProtectData()调用来刷新克隆系统上的DPAPI主密钥,所以用于DPAPI保护的用例似乎存在安全风险。
我对此事的看法是,尽管DPAPI非常适合本地计算机上的安全性(但请参阅Epyx Forensics关于密码恢复的post),您可能需要在克隆时实施其他安全措施,特别是如果你无法控制如何克隆系统。
这个问题可能会在https://security.stackexchange.com/得到更好的答案,所以你也可以在那里问。