6

我有一个简单的加密应用程序,我将在其中加密数据库中的“敏感”数据。只有拥有访问权限的人才能看到这些解密后的数据。我一直在寻找有关如何做到这一点的更多信息,这是我的项目方法:

  1. 我正在使用 AES 加密算法。
  2. 使用 RNGCryptoServiceProvider 生成 AES 密钥。使用 AES 密钥加密信息。
  3. 使用 RSA 公钥加密 AES 密钥。
  4. 将私钥存储在 USB 文件中,我只会将其提供给具有访问权限的人。
  5. 当合法的人需要看到解密的信息时,他们会提供私钥。该应用程序使用私钥解密 AES 密钥,进而解密信息。

现在,我的问题是如何安全地存储该私钥?根据我一直在阅读的内容,我可以使用 FromXMLString 获取私钥。但是,我在想,如果有人以某种方式获得了 USB 文件和 XMLFile,他可以通过类似地使用 FromXMLString 找到私钥。那么,我怎样才能保护该文件,例如,通过使用密码?c# 中是否有我可以使用的函数?

此外,如果我更改密钥对,我必须更改公钥并使用新的新公钥再次重新加密 AES 密钥。为此,我发现这篇文章如何通过 RSA 生成唯一的公钥和私钥非常有用。但是,我不确定作者是如何实现它的。他是否也将密钥容器名称存储在私钥文件中?还是 ToXMLString 自动执行此操作?

谢谢~

4

3 回答 3

5

不知何故,解密密钥或RSA获取解密密钥的密钥必须以纯文本形式保存。如果它不是 USB 驱动器,它必须在用户的脑海中。

因此,您可以做的就是进行多因素身份验证。一个只有用户知道的密码(他会把它记在脑子里或写在便利贴上;不是你的电话)和包含另一个解密密钥的 USB 驱动器。

因此,攻击者必须同时拥有密码和 USB 驱动器才能获取加密信息。

查看PBKDF2,了解如何从用户输入的密码中派生加密安全密钥。

于 2012-12-19T08:00:34.917 回答
3

解密私钥的问题在于,密钥将被直接传输到计算机的主内存中,并且可能在存储中的交换中。有几个选项可以使用私钥而不将其放入内存:

  • 使用智能卡,在 PIN 后面有一个私钥(PIN 比密码更安全,因为它们通常受到“重试计数”的保护(所以你不能尝试暴力访问)
  • 使用安全令牌,它基本上是智能卡和智能卡读卡器的组合

其他更难使用的选项:

  • 使用计算机主板上的板载可信平台模块 (TPM),它基本上是板上的智能卡
  • 使用操作系统提供的某种受保护的密钥库

此外,您可以选择使用可通过 PIN 或密码保护的 USB 驱动器。Ironkey 使经过认证的 USB 驱动器在 USB 密钥本身的硬件中执行 AES 加密。当然,这会将您的私钥移动到内存中。

如果您必须在内存中使用私钥,请确保您的系统已正确加固,例如加密交换,确保您有一个系统来维护访问权限等。

欢迎进入密钥管理领域:)

于 2012-12-19T19:06:47.160 回答
2

我建议将证书与私钥一起存储在 PKCS 兼容容器 (*.pfx) 中。在 C# 中,这可以通过 Bouncy Castle 库来完成。

这是创建对的方法:

是否可以仅使用 C# 以编程方式生成 X509 证书?

这是如何将其存储在容器中(步骤 3):

http://web.archive.org/web/20100504192226/http://www.fkollmann.de/v2/post/Creating-certificates-using-BouncyCastle.aspx

于 2012-12-19T10:54:45.170 回答