Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Если вы хотите защитить свои данные от других пользователей. Взгляните на класс ProtectedData.

(Отказ от ответственности: защита данных для создания схемы защиты от копирования не рассматривается в этом ответе).

В этом классе используется DPAPI из Windows, для шифрования и дешифрования данных на уровне пользователя или компьютера.

Использование ProtectedData/DPAPI освобождает вас от обработки ключей и обеспечения безопасности самих данных. И вы можете защитить данные для текущего пользователя. Данные могут считываться с разных компьютеров теми же пользователями домена.

Если вы хотите создать свой собственный ключ. Вы можете создать ключ для каждого пользователя/машины и сохранить этот ключ в реестре. Поскольку реестр можно защитить, только текущий пользователь может прочитать ключ обратно. Я знаю, что в реестре плохая карма, но на самом деле очень хорошо хранит данные вроде этого.

PS: Не помещайте IV в свой код. Создавайте новый IV каждый раз и помещайте его перед данными.

Ответ 2

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

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

Ответ 3

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

CspParameters cspParams = new CspParameters(PROV_RSA_FULL, null, KEYNAME);

cspParams.Flags = CspProviderFlags.UseMachineKeyStore;

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams);

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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