Контейнеры для ключей, достаточно безопасные для хранения закрытых ключей? - PullRequest
18 голосов
/ 07 августа 2009

Я читал о контейнерах ключей в .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));

Являются ли Key Containers безопасным местом для хранения личных ключей?

1 Ответ

15 голосов
/ 07 августа 2009

Это действительно зависит от ваших требований.

Хранилище ключей RSACryptoServiceProvider действительно является хранилищем ключей CryptoAPI. Ключи здесь хранятся в файловой системе, защищенной под учетными данными пользователя (если используется хранилище пользователя) или учетными данными компьютера (если используется хранилище компьютера). Это означает, что злоумышленник, имеющий доступ к соответствующим учетным данным, сможет извлечь секретный ключ.

Это будет справедливо для всех криптографических реализаций, которые не хранят ключ в смарт-карте, аппаратном модуле безопасности, микросхеме TPM и т. Д.

Чтобы защитить от менее способного злоумышленника, CryptoAPI и, следовательно, RSACryptoServiceProvider дает вам возможность установить ключ на неэкспортируемый. Это означает, что CryptoAPI / .NET откажется выполнять экспорт закрытого ключа для вас (но знающий злоумышленник все равно сможет обойти это). Для этого сгенерируйте ключ с помощью CspProviderFlags.UseNonExportableKey.

Вы также можете использовать CspProviderFlags.UseUserProtectedKey, который будет запрашивать у пользователя подтверждение и необязательный дополнительный пароль при каждом использовании закрытого ключа.

...