Как безопасно хранить строки (т.е. пароль) в приложении C ++? - PullRequest
5 голосов
/ 28 марта 2011

Я работаю над приложением wxWidgets с графическим интерфейсом, которое позволяет пользователю загружать файлы на FTP-сервер, и для доступа к FTP-серверу требуется пара имени пользователя / пароля.

Насколько я знаю,STL-строки или даже строки char * видны конечному пользователю, даже если программа уже скомпилирована с использованием шестнадцатеричных редакторов или, возможно, экстракторов строк, таких как Sysinternals String Utility .

Итак, есть ли безопасный /безопасный способ хранения конфиденциальной информации в приложении C ++?

PS.Я не могу использовать .NET для этого приложения.

Ответы [ 5 ]

7 голосов
/ 28 марта 2011

Это на самом деле не зависит от используемого языка программирования.

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

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

Как только вы начнете просматривать безопасные протоколы (например, SFTP), вы также получите инфраструктуру для безопасная аутентификация (например, открытый / закрытый ключ) при просмотре автоматического доступа.

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

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

Редактировать: Расширение превосходного комментария Кейт Грегори, в случае, если пользователи имеют общий «технический» (или анонимный) аккаунтПри доступе к вашему серверу файлы, загруженные вашим приложением, не должны быть видны на сервере, пока вы не сделали какую-либо фильтрацию.Обычный способ сделать это - иметь каталог «upload», куда файлы могут быть загружены, но не загружены из.Если вы не примете эти меры предосторожности, люди будут использовать ваш FTP-сервер в качестве проигрывателя для всех видов незаконного обмена файлами, и вы будут нести юридическую ответственность за это.

2 голосов
/ 28 марта 2011

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

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

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

edit: Если кто-то знает хороший способ с приемлемым объемом работы для защиты данных (в c ++ и без гигантских и / или дорогих фреймворков), пожалуйста, поправьте меня. Я был бы заинтересован в этой информации.

0 голосов
/ 28 марта 2011

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

0 голосов
/ 28 марта 2011

Хотя это правда, что вы не можете защитить от кого-то, кто декомпилирует ваш код и выяснит, что вы делаете, вы можете немного скрыть пароль, чтобы он не был открытым текстом внутри кода. Вам не нужно делать настоящее шифрование, просто все, что вы знаете секрет. Например, измените его, поверните на 13 или чередуйте две буквенные строки, такие как «pswr» и «asod». Или используйте отдельные символьные переменные (которые не инициализируются все вместе в одном и том же месте) и используйте числа для их установки (ascii) вместо того, чтобы иметь «a» в вашем коде.

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

0 голосов
/ 28 марта 2011

Просто необработанная идея для вас.

Рассчитайте md5 или SHA-2 вашего пароля и сохраните его в исполняемом файле.

Затем сделайте то же самое для ввода имени пользователя / пароля и сравните с сохраненным значением.

Просто и понятно.
http://en.wikipedia.org/wiki/MD5
http://en.wikipedia.org/wiki/SHA-2

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