Лучший способ хранить ключи шифрования в .NET C # - PullRequest
59 голосов
/ 11 февраля 2011

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

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

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

Ответы [ 6 ]

19 голосов
/ 11 февраля 2011

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

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

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

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

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

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

10 голосов
/ 11 февраля 2011

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

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

8 голосов
/ 12 июля 2012

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

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

cspParams.Flags = CspProviderFlags.UseMachineKeyStore;

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams);

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

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

4 голосов
/ 11 февраля 2011

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

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

3 голосов
/ 19 августа 2014

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

1 голос
/ 23 августа 2013

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...