在哪里存储AesCryptoServiceProvider的Key和IV?

时间:2011-01-20 22:07:34

标签: c# .net security

我们有一个C#(。net 3.5)应用程序。在安装过程中,我们使用AesCryptoServiceProvider加密配置文件中的一些有用信息。这些信息将在应用程序运行时由应用程序解密。因此,应用程序需要知道KeyIV

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

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

2 个答案:

答案 0 :(得分:5)

您尝试的是加密违规。加密密钥通常以纯文本形式存储在配置文件中。 IV通常与数据存储中的密文一起存储。只要你没有违反CWE-329,你应该对这个设计感到骄傲。

所有这些都是因为您试图将密文隐藏在与密钥相同的计算机上。攻击者在哪里?如果他已经在你的机器上,那么他可以启动调试器并读取内存中的密钥或纯文本。密码学无法解决这个问题,您正在寻找的是Security Though Obscurity(这不是一个安全的解决方案。)。

答案 1 :(得分:1)

我首先会回答这个问题:“你还有其他好主意吗?”

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

如果你走这条路,这是一个很好的起点。 http://msdn.microsoft.com/en-us/library/53tyfkaw(v=vs.100).aspx

如果您使用RSA,您仍需要在安装过程中将公钥和私钥放入计算机。基于你的问题,大概你有办法获得机器的钥匙 - 你只需要知道在哪里存放它。在这种情况下,Microsoft提供了存储RSA密钥的位置。您可以按照本文了解如何导入和导出密钥:http://msdn.microsoft.com/en-us/library/yxw286t2(v=vs.100).aspx

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

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

Web上的大多数示例都将引用aspnet_regiis.exe来创建,导出,导入和授予RSA密钥对的权限。您不必使用该程序,但如果您这样做,则有几个问题:

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

  2. 如果使用aspnet_regiis.exe创建密钥对,它将忽略密钥长度参数。在此响应中,当前建议的密钥长度为3072.要使用3072位私钥创建密钥对,请不要使用aspnet_regiis.exe。有关如何创建更大密钥长度的示例,请参阅How to set key size of RSA key created using aspnet_regiis?

  3. 毕竟,如果你仍然需要在某处存储aes密钥,你可以考虑将它放在一个文件中并使用cipher.exe用EFS保护它。