在我们的应用程序中,我们有很多敏感的配置设置,我们将它们存储在再次加密的xml文件中。
必须在运行时解密此安全文件,并读取配置值。但是会出现一个问题,即密钥和初始化向量在代码中进行了硬编码,因此任何人都可以使用Reflector读取它。
在.NET中存储加密密钥的最佳方法是什么,这样没人可以使用Reflector读取它们?
在我们的应用程序中,我们有很多敏感的配置设置,我们将它们存储在再次加密的xml文件中。
必须在运行时解密此安全文件,并读取配置值。但是会出现一个问题,即密钥和初始化向量在代码中进行了硬编码,因此任何人都可以使用Reflector读取它。
在.NET中存储加密密钥的最佳方法是什么,这样没人可以使用Reflector读取它们?
Answers:
如果要保护您的数据免受其他用户的侵害。看一下ProtectedData类。
(免责声明:此答案未涵盖保护数据以创建复制保护方案)。
此类使用Windows的DPAPI在用户或计算机级别上加密和解密数据。
使用ProtectedData / DPAPI可使您免于处理密钥和保护自己的数据。您可以选择为当前用户保护数据。相同的域用户可以从不同的计算机读取数据。
如果要创建自己的密钥。您可以为每个用户/机器创建一个密钥,并将该密钥存储在注册表中。因为可以保护注册表的安全,所以只有当前用户才能读回密钥。我知道注册表的业力很差,但是实际上非常擅长存储这样的数据。
PS:请勿将IV放入您的代码中。每次创建一个新的IV,并将其放在数据前面。
您应该使用计算机密钥库,它是一个安全的存储,尤其是为此目的。例如:
CspParameters cspParams = new CspParameters(PROV_RSA_FULL, null, KEYNAME);
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams);
其中KEYNAME是一个自定义字符串,可用于以后检索密钥。
有关更多示例,请参见以下问题:如何在计算机级RSA密钥容器中存储公钥