2009-08-07 9 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

trueになりますので、RSACryptoServiceProviderがあなたに与えますキーを非エクスポート可能に設定する可能性。これは、CryptoAPI/.NETが秘密鍵のエクスポートを実行することを拒否することを意味します(ただし、知識のある攻撃者は引き続きこの問題を回避できます)。これを行うには、CspProviderFlags.UseNonExportableKeyでキーを生成します。

CspProviderFlags.UseUserProtectedKeyを使用して、秘密鍵が使用されるたびにユーザーに確認とオプションの追加パスワードを要求することもできます。

関連する問題