首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安全地处理Windows密钥库中的私钥

问安全地处理Windows密钥库中的私钥
EN

Stack Overflow用户
提问于 2011-05-06 22:53:05
回答 4查看 8.2K关注 0票数 6

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

当我想要访问这些数据时,我读取用于加密AES密钥的证书的序列号,从该证书中取出私钥,解密AES密钥,然后使用该密钥解密数据。这就是我不确定我的安全级别的地方。

为了访问与证书关联的私钥,我必须将私钥标记为可导出,并向用户授予我的应用程序在访问私钥的情况下运行的权限。由于这是一台ASP.Net服务器,因此该用户是“网络服务”。我相信你能明白为什么这会是一个安全问题。基本上,如果任何人通过网络入侵我的ASP.Net服务器,可能是通过某种注入,他们就可以访问那个私钥,不是吗?

关于如何让我的模型更安全,有人有什么建议吗?

解密函数:

代码语言:javascript
复制
//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);
}

谢谢。

EN

回答 4

Stack Overflow用户

发布于 2011-06-04 19:51:41

只需通过写作

代码语言:javascript
复制
RSACryptoServiceProvider rsaCSP = (RSACryptoServiceProvider)decryptionCertificate.PrivateKey

这并不意味着你分配的是真正的“键”。您可以将私钥设置为不可导出,但仍然可以执行解密。

票数 2
EN

Stack Overflow用户

发布于 2011-05-07 14:38:36

如果您有一个带有私钥的证书,那么使用PKCS#7 / CMS对AES密钥进行加密是有意义的。这使您可以使用不可导出的私钥对数据进行解密。

不幸的是,.NET似乎没有为内容管理系统加密提供类。CryptoAPI确实提供了这样的函数(CryptEncryptMessage和CryptDecryptMessage),但它们需要通过P/Invoke调用,这在某种程度上可能不是微不足道的。对于执行此操作的C#示例,see the source code here。

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

票数 1
EN

Stack Overflow用户

发布于 2011-07-14 22:53:09

我认为你的安全模型存在一些固有的冲突。您希望在用户"Network Services“下运行的应用程序能够解密配置文件,但又希望即使"Network Services”用户受到威胁,加密的信息也是安全的。这两个目标是不一致的--要么用户可以访问数据,要么用户不能访问数据。我认为你能做的最好的事情就是分离安全访问,这样如果一台机器上的“网络服务”被攻破,它就不会损害其他用户或其他机器的安全。这就是Windows安全模型为每台计算机上的每个用户提供其自己的私钥的原因,该私钥是DPAPI用来加密/解密配置文件的密钥。

您说,在您的模型中,您正在使用一组标准密钥加密配置信息。在此模型中,如果一台计算机上的一个受信任用户受到威胁,则攻击者将获得访问所有计算机上所有用户的所有加密配置数据的密钥。您说您使用的是托管密钥,以防机器出现故障。我建议备份和管理被加密的数据比备份和管理用于访问该数据的密钥更安全。

我的建议是使用内置的.Net方法来加密/解密配置数据,该方法使用本地计算机上用户的私钥。(这里有一些实现标准方法的示例:http://weblogs.asp.net/jgalloway/archive/2008/04/13/encrypting-passwords-in-a-net-app-config-file.aspx和这里:http://www.codeproject.com/KB/security/ProtectedConfigWinApps.aspx)如果有任何数据被放到配置文件中,并且在机器发生故障时需要恢复,那么将这些数据作为备份发送到您的数据库或其他中央数据存储。这避免了对所有部署使用相同的一个或多个托管密钥。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5913153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档