将RSA私钥存储在文件中

时间:2012-12-19 07:50:37

标签: c# encryption aes rsa

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

  1. 我使用的是AES加密算法。
  2. 使用RNGCryptoServiceProvider生成AES密钥。使用AES密钥加密信息。
  3. 使用和RSA公钥加密AES密钥。
  4. 将私钥存储在USB文件中,我只会向拥有访问权限的人员提供。
  5. 当合法的人需要查看解密的信息时,他们将提供私钥。该应用程序使用私钥解密AES密钥,该密钥依次解密信息。
  6. 现在,我的问题是我如何安全地存储该私钥?根据我一直在阅读的内容,我可以使用FromXMLString获取私钥。但是,我想如果有人以某种方式获取USB文件和XMLFile,他可以通过类似地使用FromXMLString找到私钥。那么,我如何保护该文件,例如,使用密码? c#中是否有任何功能可用于此?

    此外,如果我更改密钥对,我必须更改公钥并使用新的新公钥重新加密AES密钥。为此,我发现这篇文章How to Generate Unique Public and Private Key via RSA非常有用。但是,我不确定作者如何实现它。他是否还将密钥容器名称存储在私钥文件中?或者ToXMLString会自动执行此操作吗?

    感谢〜

3 个答案:

答案 0 :(得分:3)

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

您可以做的事情就是进行多因素身份验证。只有用户知道的密码(他会把它放在脑中或者写在便利贴上;而不是你的电话)和包含其他解密密钥的USB驱动器。

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

查看PBKDF2如何从用户输入的密码中获取加密安全密钥。

答案 1 :(得分:1)

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

这是创建对的方法:

Is it possible to programmatically generate an X509 certificate using only C#?

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

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

答案 2 :(得分:1)

解密私钥的问题是密钥将以明文形式传输到计算机的主内存中,并可能传输到存储中的交换中。有一些选项可以使用私钥而无需将其存入内存:

  • 使用智能卡,PIN后面有私钥(PIN比密码更安全,因为它们通常受“重试计数”保护(因此您无法尝试强制访问)
  • 使用安全令牌,基本上是智能卡和智能卡读卡器结合使用

其他更难以使用的选项:

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

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

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

欢迎来到密钥管理领域:)