Шифрование C# в эпоху рефлектора

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

EDIT: Спасибо за все советы до сих пор, информация о таких вещах не очень распространена, и я очень ценю общие советы, а также конкретные ответы.

6 ответов


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


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

EDIT: чтобы немного уточнить: в зависимости от настройки вы можете хранить хэшированные пароли в файловой системе и полагаться на безопасность файловой системы / пользователя или в базе данных права.


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

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


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


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

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


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