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


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

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

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

7 57

7 ответов:

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

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

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

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

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

PS: Не ставьте IV в свой код. Создать новые ИЖ в любое время, и поместить его в передней части данные.

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

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

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

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.