c#中的数据加密和密钥管理

时间:2011-04-11 10:32:00

标签: c# encryption dpapi key-management

采取哪种方式,哪种优点和缺点,哪种更安全..

1)生成AES密钥,用它加密数据,然后用RSA加密AES密钥,将加密数据和加密的AES密钥保存到文件,并将RSA密钥保存到KeyContainer。

2)或者使用DPAPI ProtectedData类加密数据并将其保存到文件中,然后将我使用ProtectedData.Protect()的熵存储到某个地方......(也可以用RSA加密它,存储RSA KeyContainer的密钥对和带有数据的文件的加密熵?)

编辑:仅供参考:我们需要保护应用程序文件系统的使用。因此,应用程序存储到我们希望对其进行加密的文件系统的任何文件。该文件很可能由同一应用程序或同一应用程序堆栈的其他组件使用。

4 个答案:

答案 0 :(得分:4)

如果您正在寻找保护本地应用程序数据的加密方案,那么您选择的API取决于您是否需要在运行相同应用程序的不同服务器之间共享加密数据。

如果只有一台服务器需要访问数据,那么DPAPI应该足够好用于您的目的。安全性由用户的凭据提供,在此上下文中将是运行应用程序堆栈的凭据。您可以在应用程序中提供硬编码的附加熵(或“salt”),以提高安全性,使其不依赖于最终用户凭据。它易于实现,您无需处理导出/导入密钥。

如果多个服务器需要访问相同的文件/数据,则RSA密钥容器方法更好。可以将相同的密钥导出到多个服务器,并且它们可以共享相同的加密文件。也可以备份密钥以进行恢复。你没有DPAPI这样的选择。

一种方法中的安全性并不比另一种方法更好,因为它们使用类似的方案,并且两个密钥最终都受到用户凭证的保护。 DPAPI使用凭据来保护其使用的内部RSA密钥,Windows也将使用凭据控制对RSA密钥容器的访问。

答案 1 :(得分:2)

很抱歉,但您的问题中没有足够的信息来回答您的问题。您必须详细描述应用程序的体系结构及其使用的数据结构。

应用程序是Windows服务还是在用户上下文中运行的EXE应用程序?谁拥有您要加密的数据:应用程序,用户?用户之间是否共享数据?您是将数据保存在本地硬盘上还是服务器上(混合使用)?您是否将数据保存为用户配置文件的一部分?

最重要的是问题:您打算按住该键的位置?问题是钥匙就像你家里的钥匙:你只希望你(或你的亲密朋友)可以访问钥匙,但没有其他人。然而,人们经常可以在靠近锁的地方找到钥匙:在躺在门口的垫子下面。一个人这样做是因为还有另一个问题:如果钥匙丢失了应该怎么做?所有问题都是“密钥管理”的一部分。

DPAPI更像是10岁。它的最大优点是它有助于保存用户拥有的密钥,以便用户自动保存密钥,并且在使用roaming profiles的情况下,加密数据可以在网络上的另一台计算机上解密。如果您有相同的要求,DPAPI可以为您带来优势。

很抱歉这么一般的答案,但我认为找到问题解决方案的关键是不要使用一个或另一个API。最重要的是密钥管理。在开始加密应用程序数据之前,您应首先对应用程序的密钥管理有清晰的想象,包括对某些典型支持问题的操作。

答案 2 :(得分:1)

我过去使用过DPAPI,非常简单。 RSA密钥对对我来说非常简单。您可以根据用户/机器级别使用DPAPI保护。

MSDN link on DPAPI

答案 3 :(得分:1)

DPAPI将解密限制为绑定到计算机的密钥,甚至绑定到用户的密钥 机。

使用AES和RSA你没有这样的限制......你甚至可以在完全不同的平台上解密+在这里你知道系统是如何工作的......与DPAPI相比

您可能希望查看this