2009-08-07 2 views
18

Я читал около Key Containers in .NET как безопасное место для хранения закрытого ключа для асимметричной криптографии и цифровой подписи.Key Containers, достаточно безопасный для хранения секретных ключей?

Вопрос: насколько безопасен контейнер для ключей? потому что я узнал, если я знаю имя контейнера ключа, то я буду иметь возможность получить секретный ключ, используя следующий:

// 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, который будет запрашивать у пользователя подтверждение и дополнительный дополнительный пароль всякий раз, когда используется закрытый ключ.

Смежные вопросы