C # шифрование в эпоху отражателей - PullRequest
8 голосов
/ 16 июля 2009

У меня есть программа, в которой пароль к базе данных устанавливается удаленным пользователем. Программа сохраняет имя пользователя и пароль в зашифрованную строку в XML-файле, который в противном случае должен быть читаемым человеком. Теперь это работает нормально, я использую шифрование C # DES с ключом, и оно шифруется и расшифровывается. Теперь проблема в том, что любой может использовать отражатель, чтобы увидеть ключ. Даже с запутыванием ключ должен быть очевиден. Итак, как с этим справиться? Теперь мне не нужно, чтобы это было защищено АНБ, но я действительно хотел бы, чтобы никто не заглядывал. Спасибо.

РЕДАКТИРОВАТЬ: Спасибо за все советы, информация о такого рода вещах не очень широко распространена, и я действительно ценю общие советы, а также конкретные ответы.

Ответы [ 6 ]

8 голосов
/ 16 июля 2009

Попробуйте использовать DPAPI (класс System.Security.ProtectedData). Это защищает ваши зашифрованные данные с использованием учетных данных пользователя или компьютера. Таким образом, только учетная запись пользователя, которая получает доступ к данным (учетные данные пользователя) или пользователь, который может войти в систему на компьютере (учетные данные компьютера), сможет расшифровать ваши данные.

5 голосов
/ 16 июля 2009

На самом деле это не проблема рефлектора или нет. Это касается управления ключами. DES и любая другая схема шифрования основаны на регулярной смене ключей. Жесткое кодирование ключа в коде явно нарушает это. Чтобы обойти это, вы должны изучить управление ключами.

РЕДАКТИРОВАТЬ: Для уточнения: в зависимости от вашей настройки, вы можете хранить хешированные пароли в файловой системе и полагаться на файловую систему / безопасность пользователя или в базе данных, полагаясь на права базы данных.

4 голосов
/ 17 июля 2009

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

Вы должны запросить учетные данные у своего пользователя, сохранить имя пользователя / имя и пароль БД в обычном разделе конфигурации в файле app.config и использовать класс DpapiProtectedConfigurationProvider для шифрования и расшифровки раздела для вас, используя ключи машины или пользовательский ключ. Смотрите ссылку, которую я предоставил для полного примера, как это сделать.

2 голосов
/ 16 июля 2009

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

1 голос
/ 16 июля 2009

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

1 голос
/ 16 июля 2009

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

http://www.codinghorror.com/blog/archives/000953.html

...