2009-08-07 340 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,每當使用私鑰時,它會要求用戶確認並輸入一個可選的附加密碼。