6

我正在开发一个为 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);
}

谢谢。

4

4 回答 4

2

只需要写

RSACryptoServiceProvider rsaCSP = (RSACryptoServiceProvider)decryptionCertificate.PrivateKey

这并不意味着您正在分配实际的“密钥”。您可以使私钥不可导出,并且仍然能够执行解密。

于 2011-06-04T11:51:40.787 回答
1

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

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

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

于 2011-05-07T06:38:35.970 回答
1

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

您说在您的模型中,您正在使用一组标准密钥加密配置信息。在此模型中,如果一台机器上的一个受信任用户受到威胁,那么攻击者将获得访问所有机器上所有用户的所有加密配置数据的密钥。你说你在机器故障的情况下使用托管密钥。我建议备份和管理被加密的数据然后备份和管理用于访问该数据的密钥更安全。

我的建议是使用内置的 .Net 加密/解密配置数据的方法,该方法使用本地计算机上用户的 Windows 私钥。(这里有一些实施标准方法的例子: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 ) 如果将任何数据放入配置文件中,这些数据是必不可少的,并且在机器出现故障时需要恢复,然后将该数据发送到您的数据库或其他中央数据存储作为备份。这避免了对所有部署使用相同的托管密钥或密钥。

于 2011-07-14T14:53:08.733 回答
0

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

您是正确的,在网络服务下运行的任何服务都可能会访问私钥。大约在 2005 年左右的某个时候,微软意识到了这一点,并开始创建独特的服务帐户以限制对常见服务(如网络服务)造成的损害。例如,SQL Server 被移动到它自己的服务帐户 IIRC。

根本问题是微软模型的安全设计问题,你可以用它做很多事情。微软意识到了这一点,并使用 CryptoNG,IIRC 转向了一个稍微不同的模型。在 CryptoNG 下,使用私钥的操作是进程外的,IPC 用于在服务和执行密钥操作的进程之间来回传递请求和结果。这主要是解决您关注的问题。

即使在新模型下,您仍然需要能够识别该模型的软件。IIS 7 应该没问题,但是 Apache 可能会导致问题,因为它的模型只识别文件系统 ACL。

将关键操作移出流程正在成为一种标准做法。例如,GnuPG 也是如此。GnuPG 使用一个名为libassuan的库来执行消费者和生产者之间的请求和结果的编组。

我不会太担心进程外模型中客户端和服务器之间的效率问题。Windows 管道、Unix 管道和 Unix 域套接字正在快速发展。此外,这很像Jon Bentley 博士所说的:如果它不必是正确的,我可以尽可能快地完成它。

于 2016-01-03T14:40:24.050 回答