9

我正在测试将 .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 部门预加载了一个系统,然后该系统成为一组具有相同硬件配置的机器的基本映像)。在不同硬件上恢复的操作系统是否能够解密在“原始”系统上加密的文件?我希望由于不同的硬件,解密会失败,但如果所有必要的加密信息都存在于注册表或文件系统中,它可能会起作用。

显然,我可以自己测试这个,但我现在真的没有资源这样做,并且一直在无休止地搜索,看看是否有其他人可能已经知道答案。非常感谢任何建议!

4

2 回答 2

4

我的答案仅适用于DataProtectionScope.LocalMachine因为显然DataProtectionScope.CurrentUser使用存储在 Active Directory 或其他漫游源中的密钥,并且根据设计明确地不绑定到单个物理密钥。

LocalMachine目前而言,计算机的克隆将能够打开相同的文件,因为机器密钥存储在机器的 HDD 上,并且是使用安装 Windows 的“sysprep”阶段生成的(这就是企业 Windows 推出的原因可以使用相同的系统映像,但只要它们运行 sysprep,每个系统都会有自己的密钥)。

计算机可以重新创建其机器密钥(它还可以保留旧密钥,以便旧数据仍然可以解密)。但是,我不知道如何让它重新创建密钥然后删除旧密钥。

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

于 2012-11-30T20:31:08.920 回答
0

好问题 - 似乎每 ca 都会自动重新生成主密钥。90 天。在 Passcape.com 上有一个很好的分析- DPAPI 安全性的核心与系统的 SYSKEY 相关联,该系统的 SYSKEY 存储在 SYSTEM 配置单元下的注册表中。

因为显然可以使用带有 CRYPT_PROTECT_REGENERATE 标志的 CryptProtectData() 调用来刷新克隆系统上的 DPAPI 主密钥,所以您的 DPAPI 保护用例似乎存在安全风险。

我对此事的看法是,虽然 DPAPI 对本地机器上的安全性非常有用(但请参阅 Epyx Forensics 上关于密码恢复的这篇文章),但在克隆时您可能需要实施额外的安全措施,尤其是在您无法控制的情况下如何克隆系统。

这个问题可能会在https://security.stackexchange.com/上得到更好的答案,因此您可能也想在那里提问。

于 2012-11-30T20:35:04.503 回答