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