C# 在文件中存储RSA私钥

C# 在文件中存储RSA私钥,c#,encryption,aes,rsa,C#,Encryption,Aes,Rsa,我有一个简单的加密应用程序,我将加密数据库中的“敏感”数据。只有拥有访问权限的人才能看到解密后的数据。我一直在四处寻找关于如何做到这一点的更多信息,以下是我的项目方法: 我使用的是AES加密算法 使用RNGCryptoServiceProvider生成AES密钥。使用AES密钥加密信息 使用和RSA公钥加密AES密钥 将私钥存储在USB文件中,我只会将其提供给具有访问权限的人 当合法的人需要查看解密的信息时,他们将提供私钥。应用程序使用私钥解密AES密钥,AES密钥反过来解密信息 现在,我的问题

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

  • 我使用的是AES加密算法
  • 使用RNGCryptoServiceProvider生成AES密钥。使用AES密钥加密信息
  • 使用和RSA公钥加密AES密钥
  • 将私钥存储在USB文件中,我只会将其提供给具有访问权限的人
  • 当合法的人需要查看解密的信息时,他们将提供私钥。应用程序使用私钥解密AES密钥,AES密钥反过来解密信息
  • 现在,我的问题是如何安全地存储该私钥?根据我所阅读的内容,我可以使用FromXMLString获取私钥。但是,我在想,如果有人以某种方式获得USB文件和XML文件,他可以通过类似地使用FromXMLString来找到私钥。那么,如何保护该文件,例如,使用密码短语?c#中有什么函数我可以使用吗

    此外,如果我更改密钥对,我必须更改公钥,并使用新的公钥重新加密AES密钥。为此,我发现这篇文章非常有用。但是,我不确定作者是如何实现它的。他是否也将密钥容器名称存储在私钥文件中?或者字符串自动执行该操作


    多谢~

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

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

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


    了解如何从用户输入的密码派生加密安全密钥。

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

    以下是如何创建该对:

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


    解密私钥的问题是,该密钥将以明文形式传输到计算机的主内存中,也可能在存储中的交换中传输。有几个选项可以在不将私钥放入内存的情况下使用私钥:

    • 使用智能卡,PIN后面有私钥(PIN比密码更安全,因为它们通常受到“重试计数”的保护(因此您不能尝试强行访问)
    • 使用安全令牌,基本上是智能卡和智能卡读卡器的组合
    其他更难使用的选项:

    • 使用计算机主板上的板载可信平台模块(TPM),该模块基本上是板载智能卡
    • 使用操作系统提供的某种受保护的密钥存储
    此外,您还可以选择使用可以使用PIN码或密码保护的USB驱动器。Ironkey使用在USB密钥本身的硬件中执行AES加密的认证USB驱动器。当然,这会将您的私钥移动到内存中

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


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

    谢谢您的回答。那么,您的意思是从密码中派生一个密钥,并使用它来加密私钥文件?是的,应该可以。因此,最终这一切都取决于用户头脑中的密码。但那将不是多因素认证。可能先使用USB驱动器中的密钥进行加密,然后使用您从用户应该记住的密码中获得的密钥重新加密,或者您可以
    XOR
    两个密钥获得一个密钥,然后使用该密钥进行加密。XOR的想法听起来不错。谢谢但是,我认为PBKDF2派生密钥应该足够好。如果密码不知何故在对手手中,他可以解密信息。但是,如果考虑到多个因素,对手也需要访问USB驱动器。你的电话。好吧,假设我使用XOR方法。私钥文件现在使用单个密钥(passphraseKey XOR私钥)进行加密。我必须在得到私钥之前解密它。那么,我如何取回用于解密的单个密钥呢?PS除了Wiktor和Ranhiru提供的答案之外,还提供了这个答案。谢谢,owlstead。我最近在学校上了一堂密码学课,我发现好的密钥管理真的很难!