22

我正在阅读.NET 中的密钥容器作为存储用于非对称加密和数字签名的私钥的安全场所。

我的问题是密钥容器有多安全?因为我发现如果我知道密钥容器名称,那么我将能够使用以下方法检索私钥:

// Create the CspParameters object and set the key container 
// name used to store the RSA key pair.
CspParameters cp = new CspParameters();
cp.KeyContainerName = ContainerName;

// Create a new instance of RSACryptoServiceProvider that accesses
// the key container MyKeyContainerName.
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

// Display the key information to the console.
Console.WriteLine("Key retrieved from container : \n {0}", rsa.ToXmlString(true));

密钥容器是存储私钥的安全场所吗?

4

1 回答 1

19

这真的取决于你的要求。

RSACryptoServiceProvider 背后的密钥库实际上是 CryptoAPI 密钥库。此处的密钥存储在受用户凭据(如果使用用户存储)或机器凭据(如果使用机器存储)保护的文件系统上。这意味着有权访问正确凭据的攻击者将能够提取私钥。

这适用于所有不将密钥存储在智能卡、硬件安全模块、TPM 芯片等中的加密实现。

为了防止能力较弱的攻击者,CryptoAPI 和因此 RSACryptoServiceProvider 使您可以将密钥设置为不可导出。这意味着 CryptoAPI/.NET 将拒绝为您执行私钥导出(但知识渊博的攻击者仍然能够解决此问题)。为此,请使用 生成密钥CspProviderFlags.UseNonExportableKey

您还可以使用CspProviderFlags.UseUserProtectedKey它将在使用私钥时要求用户确认和可选的附加密码。

于 2009-08-07T07:38:47.087 回答