Контейнеры ключей достаточно безопасны для хранения личных ключей?

StackOverflow https://stackoverflow.com/questions/1243259

  •  12-09-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top