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

gan*_*ran 63 .net c# security encryption

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

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

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

GvS*_*GvS 19

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

(免责声明:此答案不包括保护您的数据以创建复制保护方案).

此类使用Windows中的DPAPI来加密和解密用户或计算机级别的数据.

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

如果你想创建自己的密钥.您可以为每个用户/计算机创建密钥,并将此密钥存储在注册表中.由于可以保护注册表,因此只有当前用户才能读回密钥.我知道注册表有不好的业力,但实际上非常擅长存储这样的数据.

PS:不要把IV放在你的代码中.每次创建一个新的IV,并将其放在数据前面.

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

Mas*_*sif 10

如果您无法在反射器中读取它们,您希望程序如何读取它们?您可以通过分解它们并将部件存储在整个地方来对它们进行模糊处理,但是(AFAIK)一旦您要求程序能够读取它们,那么任何有权访问您的代码的人也可以阅读它们.

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


Mui*_*uis 9

您应该使用Machine Keystore,它是一个安全的存储,尤其是为此目的.例如:

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

cspParams.Flags = CspProviderFlags.UseMachineKeyStore;

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams);
Run Code Online (Sandbox Code Playgroud)

KEYNAME是一个自定义字符串,可用于稍后检索密钥.

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