22

非対称暗号化とデジタル署名用の秘密鍵を安全に保管できる場所として、.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));

キーコンテナは秘密鍵を保管するための安全な場所ですか?

4

1 に答える 1

19

それは本当にあなたの要件に依存します。

RSACryptoServiceProviderの背後にあるキーストアは、実際にはCryptoAPIキーストアです。ここでのキーは、ユーザークレデンシャル(ユーザーストアを使用している場合)またはマシンクレデンシャル(マシンストアを使用している場合)で保護されたファイルシステムに保存されます。これは、適切な資格情報にアクセスできる攻撃者が秘密鍵を抽出できることを意味します。

これは、キーをスマートカード、ハードウェアセキュリティモジュール、TPMチップなどに保存しないすべての暗号化実装に当てはまります。

能力の低い攻撃者から保護するために、CryptoAPI、つまりRSACryptoServiceProviderを使用すると、キーをエクスポート不可に設定できます。これは、CryptoAPI / .NETが秘密鍵のエクスポートの実行を拒否することを意味します(ただし、知識のある攻撃者はこれを回避できます)。これを行うには、を使用してキーを生成しますCspProviderFlags.UseNonExportableKey

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

于 2009-08-07T07:38:47.087 に答える