从Windows密钥库安全处理私钥

Pet*_*y B 6 c# security cryptography x509 private-key

我正在开发一个加密ASP.Net Web服务器的配置文件设置的应用程序.我正在实现的加密方法是使用AES和RSA封装数据.我正在生成一个AES密钥,使用该AES密钥加密我的数据,然后使用我的Windows证书存储区中的证书中的公钥加密AES密钥.然后,我将数据与加密的AES密钥以及用于加密它的证书序列号一起保存回配置文件.

当我想访问此数据时,我读取用于加密AES密钥的证书的序列号,从该证书中提取私钥,并解密AES密钥,然后使用该密钥解密数据.这是我不确定我的安全水平的地方.

为了访问与证书关联的私钥,我必须将私钥标记为可导出,并在用户访问私钥的情况下运行我的应用程序.由于这是一个ASP.Net服务器,该用户是"网络服务".我相信你能明白为什么这会是一个安全问题.基本上如果有人通过网络闯入我的ASP.Net服务器,也许通过某种注入,他们可以访问该私钥,不是吗?

有没有人对如何让我的模型更安全有任何建议?

解密功能:

//need an rsa crytpo provider to decrypt the aes key with the private key associated with the certificate
using (RSACryptoServiceProvider rsaCSP = (RSACryptoServiceProvider) decryptionCertificate.PrivateKey)
{
    //decrypt the aes key with the cert's private key
    byte[] aesKey = rsaCSP.Decrypt(encryptedAESKey, false);

    //decrypt data using the decrypted aes key and the IV passed in
    decryptedData = decryptWithAes(encryptedData, aesKey, aesIV);
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Eug*_*its 1

如果您拥有带有私钥的证书,则采用 AES 密钥的 PKCS#7/CMS 加密是有意义的。这使您可以使用不可导出的私钥解密数据。

不幸的是.NET 似乎没有提供 CMS 加密的类。CryptoAPI 确实提供了此类函数(CryptEncryptMessageCryptDecryptMessage),但它们需要通过 P/Invoke 调用,这在某种程度上可能并不简单。有关执行此操作的 C# 示例,请参阅此处的源代码

另一种选择是使用我们的SecureBlackbox组件(TElMessageEncryptor、TElMessageDecryptor),尽管在您的情况下这可能有点过头了。