2009-08-07 144 views
18

我正在阅读关于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)); 

的关键容器存储私钥安全的地方吗?

回答

15

这真的取决于您的要求。

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

这将是不存储在智能卡钥匙,硬件安全模块,TPM芯片等所有的加密实现真正

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

您也可以使用CspProviderFlags.UseUserProtectedKey,每当使用私钥时,它会要求用户确认并输入一个可选的附加密码。