在.NET C#中存储加密密钥的最佳方法


70

在我们的应用程序中,我们有很多敏感的配置设置,我们将它们存储在再次加密的xml文件中。

必须在运行时解密此安全文件,并读取配置值。但是会出现一个问题,即密钥和初始化向量在代码中进行了硬编码,因此任何人都可以使用Reflector读取它。

在.NET中存储加密密钥的最佳方法是什么,这样没人可以使用Reflector读取它们?


3
这是桌面应用程序还是基于Web的应用程序?如果它是基于Web的,是分布式的,还是您控制服务器?
Paddy

您还应该指出所需的安全级别。隐藏事物的方法有很多,而从隐藏的角落获取事物的方法也不少。)
Ilya Dvorovoy 2011年

也许现在RedGate正在为Reflector收费了.. ;-)
Grant Crofton

@Paddy:它是一个桌面应用程序。
ganeshran

那么如何将密钥存储在硬件上呢,这里我说的是硬件安全模块!我们可以将其作为隐藏密钥的最佳做法吗?我们可以将密钥存储在配置文件中然后对配置文件进行加密吗?就我而言,我在谈论一个独立的.Net应用程序。
iamjayp '17

Answers:


23

如果要保护您的数据免受其他用户的侵害。看一下ProtectedData类。

(免责声明:此答案未涵盖保护数据以创建复制保护方案)。

此类使用Windows的DPAPI在用户或计算机级别上加密和解密数据。

使用ProtectedData / DPAPI可使您免于处理密钥和保护自己的数据。您可以选择为当前用户保护数据。相同的域用户可以从不同的计算机读取数据。

如果要创建自己的密钥。您可以为每个用户/机器创建一个密钥,并将该密钥存储在注册表中。因为可以保护注册表的安全,所以只有当前用户才能读回密钥。我知道注册表的业力很差,但是实际上非常擅长存储这样的数据。

PS:请勿将IV放入您的代码中。每次创建一个新的IV,并将其放在数据前面。


DPAPI在反编译后也很容易被黑客入侵
Wowa

1
@Wowa:反编译什么:您的程序?然后您可以看到该应用程序使用了DPAPI。当您没有来自用户的密钥时,这仍然不允许解密。
GvS

我认为密钥和IV对于解密和加密必须是恒定的。iv可以更改并且文本仍然可以解密吗?我想我需要做更多的阅读。
ganeshran

5
您需要使用相同的IV进行加密和解密,但这不是像密钥这样的秘密。因此,您可以在每次加密运行时生成不同的IV,并将IV分配给接收器。最简单的方法是将IV放在加密内容之前。每次运行都创建一个新的IV,将使查找密钥变得更加困难。
GvS

1
@hossein如果不这样做怎么办?您仍然可以使用dpapi。
Wjdavis5

11

您应该使用计算机密钥库,它是一个安全的存储,尤其是为此目的。例如:

CspParameters cspParams = new CspParameters(PROV_RSA_FULL, null, KEYNAME);

cspParams.Flags = CspProviderFlags.UseMachineKeyStore;

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams);

其中KEYNAME是一个自定义字符串,可用于以后检索密钥。

有关更多示例,请参见以下问题:如何在计算机级RSA密钥容器中存储公钥


10

如果您无法在反射器中读取它们,您希望程序如何读取它们?您可以通过分解它们并将它们存储在各处来对其进行混淆,但是(AFAIK)一旦您要求程序能够读取它们,那么任何有权访问您代码的人都可以读取它们。

不要忘记也可以访问内存中的值(咳嗽SecureString)。


4

通常,应该为每个会话创建一个新的密钥和IV,并且密钥和IV都不应存储供以后的会话使用。

要将对称密钥和IV与远程方进行通信,通常会使用非对称加密对对称密钥和IV进行加密。通过不安全的网络发送这些值而不对其进行加密是非常不安全的,因为任何拦截这些值的人都可以解密您的数据。有关此密钥和IV加密和传输过程的更多信息,请参阅创建加密方案


3

安装应用程序时,请制作一组新的RSA密钥,然后使用私钥作为密码使用AES加密数据。由于Windows将RSA私钥安全地存储在创建私钥的PC上,因此只能由创建数据的计算机解密数据,因为只有该计算机才具有必要的密钥。


1

如何将文件加密/解密密钥存储在远程服务器上,通过Web服务将其通过https传输到应用程序,该怎么办?这样,密钥将保留在计算机的内存中,但不会保留在源代码文件中。

但是,这要求运行该应用程序的任何人都必须与密钥服务器建立连接。


你是对的。但是,我们仍然可以恢复密钥,因为它留在RAM的计算机内存中。它仍然不是保护密钥的适用方法。此外,http也不安全。
iamjayp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.