我正在阅读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));
密钥容器是否是存储私钥的安全位置?
答案 0 :(得分:15)
这实际上取决于您的要求。
RSACryptoServiceProvider背后的密钥库实际上是CryptoAPI密钥库。此处的密钥存储在受用户凭据保护的文件系统(如果使用用户存储)或机器凭据(如果使用机器存储)中。这意味着有权访问正确凭据的攻击者将能够提取私钥。
对于未将密钥存储在智能卡,硬件安全模块,TPM芯片等中的所有加密实现,都是如此。
为了防御能力较弱的攻击者,CryptoAPI和RSACryptoServiceProvider使您可以将密钥设置为不可导出。这意味着CryptoAPI / .NET将拒绝为您执行私钥导出(但知识渊博的攻击者仍然可以解决此问题)。为此,请使用CspProviderFlags.UseNonExportableKey
生成密钥。
您还可以使用CspProviderFlags.UseUserProtectedKey
,无论何时使用私钥,都会要求用户进行确认和可选的附加密码。