在我们的应用程序中,我们有许多敏感的配置设置,我们将其存储在再次加密的xml文件中。
此安全文件必须在运行时解密并读取配置值。但是出现了一个问题,即密钥和初始化向量在代码中是硬编码的,因此任何人都可以使用Reflector读取它。
在.NET中存储加密密钥的最佳方法是什么,所以没有人可以使用Reflector读取它们?
答案 0 :(得分:19)
如果您想保护您的数据免受其他用户的侵害。看一下ProtectedData课程。
(免责声明:此答案不包括保护您的数据以创建复制保护方案。)
此类使用Windows中的DPAPI来加密和解密用户或计算机级别的数据。
使用ProtectedData / DPAPI可以让您自己处理密钥和保护数据。您可以选择保护当前用户的数据。可以由相同的域用户从不同的计算机读取数据。
如果您想创建自己的密钥。您可以为每个用户/计算机创建密钥,并将此密钥存储在注册表中。由于可以保护注册表,因此只有当前用户才能读回密钥。我知道注册表有不好的业力,但实际上非常擅长存储这样的数据。
PS:不要将IV放入代码中。每次创建一个新的IV,并将其放在数据前面。
答案 1 :(得分:10)
如果您无法在反射器中阅读它们,您希望程序如何读取它们?您可以通过分解它们并将所有部件存储在整个地方来混淆它们,但是(AFAIK)一旦您要求程序能够读取它们,那么任何有权访问您的代码的人都可以读取它们。
不要忘记内存中的值也可以访问( cough SecureString)。
答案 2 :(得分:8)
您应该使用Machine Keystore,它是一个安全的存储,尤其是为此目的。例如:
CspParameters cspParams = new CspParameters(PROV_RSA_FULL, null, KEYNAME);
cspParams.Flags = CspProviderFlags.UseMachineKeyStore;
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams);
其中KEYNAME是一个自定义字符串,可用于稍后检索密钥。
有关更多示例,请参阅此问题:How to store a public key in a machine-level RSA key container
答案 3 :(得分:4)
通常,应为每个会话创建一个新密钥和IV,并且不应存储密钥和IV以便在以后的会话中使用。
要将对称密钥和IV传送给远程方,通常使用非对称加密来加密对称密钥和IV。在不加密的情况下在不安全的网络上发送这些值是非常不安全的,因为任何截获这些值的人都可以解密您的数据。有关加密和传输密钥和IV的过程的更多信息,请参阅Creating a Cryptographic Scheme。
答案 4 :(得分:3)
安装应用程序时,请创建一组新的RSA密钥,然后使用私钥作为密码使用AES加密数据。由于Windows将RSA私钥安全地存储在创建它们的PC上,因此数据只能由创建数据的计算机解密,因为只有该计算机才能拥有必要的密钥。
答案 5 :(得分:1)
如何将文件加密/解密密钥存储在远程服务器上,通过将其通过https传输到应用程序的Web服务获取?这样,密钥留在计算机的内存中,但不是源代码文件。
这需要通过运行应用程序的任何人与密钥服务器建立连接。