Лучший способ хранения ключей шифрования в .NET C #

В нашем приложении у нас много конфиденциальных настроек конфигурации, которые мы храним в XML-файле, который снова зашифрован.

Этот защищенный файл должен быть дешифрован во время выполнения и считываться значения конфигурации. но возникает проблема, что ключ и вектор инициализации жестко закодированы в коде, и, следовательно, любой может прочитать его с помощью Reflector.

Каков наилучший способ хранения ключей шифрования в .NET, поэтому никто не может их читать с помощью Reflector?

Если вы не можете прочитать их в рефлекторе, как вы ожидаете, что программа их прочтет? Вы можете запутывать их, разбивая их и сохраняя детали повсюду, но (AFAIK), как только вам потребуется, чтобы ваша программа могла их читать, тогда любой, кто имеет доступ к вашему коду, может их прочитать.

Не забывайте, что в памяти также могут быть доступны значения ( cough SecureString).

Вы должны использовать Machine Keystore, это специально для этой цели безопасное хранилище. Например:

CspParameters cspParams = new CspParameters(PROV_RSA_FULL, null, KEYNAME); cspParams.Flags = CspProviderFlags.UseMachineKeyStore; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams); 

Где KEYNAME – это настраиваемая строка, которая может быть использована для получения ключа позже.

Дополнительные примеры см. В этом вопросе: Как сохранить открытый ключ в контейнере ключей RSA на уровне машины

Как правило, для каждого сеанса должен быть создан новый ключ и IV, и ни ключ, ни IV не должны храниться для использования в более позднем сеансе.

Чтобы передать симметричный ключ и IV удаленной стороне, вы обычно шифруете симметричный ключ и IV, используя асимметричное шифрование. Отправка этих значений в ненадежную сеть без их шифрования крайне небезопасна, так как любой, кто перехватывает эти значения, может затем расшифровать ваши данные. Для получения дополнительной информации об этом процессе шифрования и передачи ключа и IV см. Создание криптографической схемы .

Когда вы устанавливаете приложение, создаете новый набор ключей RSA, затем шифруйте данные с помощью AES с использованием закрытого ключа в качестве пароля. Поскольку Windows надежно хранит секретные ключи RSA на созданном ими ПК, данные могут быть дешифрованы только на компьютере, который создал данные, потому что только тот компьютер будет иметь необходимый ключ.

Как насчет хранения ключа шифрования / дешифрования файла на удаленном сервере, получая его, хотя веб-сервис, который будет передавать его, хотя https в приложение? таким образом, ключ остается в памяти компьютера, но не находится в файле исходного кода.

Для этого требуется подключение к ключевому серверу тем, кто запускает приложение.

Что касается хранения ключа на аппаратном обеспечении, здесь я говорю о модулях безопасности оборудования! Можем ли мы использовать его как лучшие методы, чтобы скрыть ключ? Можем ли мы сохранить ключ в файле конфигурации, а затем зашифровать файл конфигурации? В моем случае я говорю об автономном приложении .Net.

  • Разница между кодированием и шифрованием
  • Шифрование OpenSSL с использованием classов .NET
  • Как я могу сделать свое шифрование AES идентичным между Java и Objective-C (iPhone)?
  • Формат открытых ключей RSA
  • Шифрование и расшифровка большой строки в java с помощью RSA
  • Java-эквивалент шифрования OpenSSL AES CBC
  • Указанный ключ не является допустимым для этого алгоритма
  • javax.crypto.BadPaddingException
  • В чем разница между шифрованием и подписью в асимметричном шифровании?
  • Как декодировать строку, закодированную с помощью openssl aes-128-cbc, используя java?
  • Как использовать OpenSSL для шифрования / дешифрования файлов?
  • Давайте будем гением компьютера.