2011-01-20 50 views
8

我们有一个C#(.net 3.5)应用程序。在安装过程中,我们使用AesCryptoServiceProvider来加密配置文件中的一些有用信息。这些信息将在应用程序运行时被解密。因此,应用程序需要知道KeyIV在哪里存储AesCryptoServiceProvider的Key和IV?

我们正在考虑到KeyIV的byte []存储在计算机上的一个安全的地方。我知道有一个machine store可以存储RSA密钥对。我可以在那里存储KeyIV字节[]吗?我在网上搜索并阅读MSDN文档,但无法找到一种方法来做到这一点。

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

回答

4

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

这里所有这些都是因为你试图在密钥的同一台机器上隐藏密文而造成的。攻击者在哪里?如果他已经在你的机器上,那么他可以启动一个调试器并读取内存中的密钥或纯文本。加密不能解决这个问题,你在找什么是Security Though Obscurity(这不是一个安全的解决方案。)。

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?

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