密钥容器,足够安全存储私钥?

时间:2009-08-07 06:42:29

标签: .net cryptography keystore

我正在阅读Key Containers in .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));

密钥容器是否是存储私钥的安全位置?

1 个答案:

答案 0 :(得分:15)

这实际上取决于您的要求。

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

对于未将密钥存储在智能卡,硬件安全模块,TPM芯片等中的所有加密实现,都是如此。

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

您还可以使用CspProviderFlags.UseUserProtectedKey,无论何时使用私钥,都会要求用户进行确认和可选的附加密码。