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