C# 在何处存储AESCryptServiceProvider的密钥和IV?

C# 在何处存储AESCryptServiceProvider的密钥和IV?,c#,.net,security,C#,.net,Security,我们有一个C#(.NET3.5)应用程序。在安装过程中,我们使用AESCryptServiceProvider对配置文件中的一些有用信息进行加密。这些信息将在应用程序运行时被解密。因此,应用程序需要知道键和IV 我们正在考虑将键和IV字节[]存储在机器上的安全位置。我知道有一个机器存储可以存储RSA密钥对。我可以将键和IV字节[]存储在那里吗?我在网上搜索并阅读了MSDN文档,但找不到方法 你知道怎么做吗?你还有什么好主意吗?你尝试的是加密违规。加密密钥通常以明文形式存储在配置文件中。IV通常与

我们有一个C#(.NET3.5)应用程序。在安装过程中,我们使用AESCryptServiceProvider对配置文件中的一些有用信息进行加密。这些信息将在应用程序运行时被解密。因此,应用程序需要知道
IV

我们正在考虑将
IV
字节[]存储在机器上的安全位置。我知道有一个
机器存储
可以存储RSA密钥对。我可以将
IV
字节[]存储在那里吗?我在网上搜索并阅读了MSDN文档,但找不到方法


你知道怎么做吗?你还有什么好主意吗?

你尝试的是加密违规。加密密钥通常以明文形式存储在配置文件中。IV通常与密文一起存储在数据存储中。只要你不违反你应该是黄金与此设计


所有这些问题的症结在于,您试图在与密钥相同的机器上隐藏密码文本。袭击者在哪里?如果他已经在您的机器上,那么他可以启动调试器并读取内存中的密钥或纯文本。密码学无法解决这个问题,您需要的是(这不是一个安全的解决方案)

我先回答这个问题,“你还有什么好主意吗?”

Net framework内置了对加密配置节的支持。您可以将此加密应用于大多数配置部分,但有少数例外(例如machine.config)。除非您有充分的理由使用自己的配置加密,否则最好使用框架中已经提供给您的配置加密

如果你走这条路,这里有一个很好的起点。

如果使用RSA,则在安装过程中仍需要将公钥和私钥放到计算机上。根据你的问题,你大概有办法拿到这台机器的钥匙——你只需要知道把它存放在哪里。在这种情况下,Microsoft提供了一个存储RSA密钥的位置。您可以按照本文介绍如何导入和导出密钥:

在运行应用程序的计算机上,在安装密钥对时将私钥标记为不可导出,以增加安全性。如果应用程序在特定用户帐户下运行,请在用户存储中安装密钥对

用户(或大多数web应用程序的应用程序池)将需要读取私钥的权限。您可以使用aspnet_regiis.exe授予权限

web上的大多数示例都会引用aspnet_regais.exe来创建、导出、导入RSA密钥对并授予其权限。您不必使用该程序,但如果您使用该程序,则会遇到一些问题:

  • 它仅在名为web.config的文件上运行。因此,如果您有一个控制台应用程序,您必须将配置文件重命名为web.config,以便与aspnet_regiis.exe一起使用

  • 如果使用aspnet_regiis.exe创建密钥对,它将忽略密钥长度参数。截至此响应,当前建议的密钥长度为3072。要使用3072位私钥创建密钥对,请不要使用aspnet_regais.exe。有关如何创建更大密钥长度的示例,请参阅

  • 毕竟,如果您仍然需要将AES密钥存储在某个地方,您可以考虑将其放入文件中,并使用密码.EX../P>使用EFS来保护它。