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

采取哪条路线,哪些是利弊,哪个更安全..

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

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

编辑:只是为了更多信息:我们需要保护我们的应用程序文件系统使用。 因此,应用程序存储到文件系统的任何文件,我们希望它被加密。 该文件很可能由同一应用程序或同一应用程序堆栈的另一个组件使用。

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

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

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

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

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

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

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

DPAPI已经超过10年了。 它的最大优点是它有助于保存用户拥有的密钥,以便用户自动保存密钥,并且在使用漫游配置文件的情况下,加密数据可以在网络上的另一台计算机上解密。 如果您有相同的要求,DPAPI可以为您带来优势。

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

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

DPAPI上的MSDN链接

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

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

你可能想看看这个