Шифрование пароля в скомпилированном коде C или C ++ - PullRequest
4 голосов
/ 14 июня 2010

Я знаю, как скомпилировать исходные файлы C и C ++, используя GCC и CC в терминале, однако я хотел бы знать, безопасно ли включать пароли в эти файлы после компиляции.

Например ... я проверяю пользовательский ввод для определенного пароля, например 123, но кажется, что скомпилированные программы C / C ++ можно декомпилировать.

В любом случае можно ли скомпилировать исходный файл C / C ++, сохраняя при этом источник полностью скрытым? Если нет, может ли кто-нибудь привести небольшой пример шифрования ввода, а затем проверить его по паролю, например: (SHA1, MD5)

Ответы [ 6 ]

4 голосов
/ 14 июня 2010

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

Вопрос в том, от кого вы пытаетесь защитить? Ваш маленький брат, хакер,международные шпионы, промышленный шпионаж?

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

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

4 голосов
/ 14 июня 2010

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

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

enc = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"

bool check() {
    pass = getPassFromUser();
    encpass = myHashingFunction(pass);
    return pass == encpass;
}

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

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

3 голосов
/ 14 июня 2010

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

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

Большинство паролей для входа (различных сайтов) не хранятся в открытом виде вбазы данных, но зашифрованные с помощью алгоритмов MD5, SHA1, Blowfish и т. д.

Я бы предложил использовать один из этих алгоритмов из библиотеки OpenSSL .

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

2 голосов
/ 14 июня 2010

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

Вам придется каким-то образом их кодировать.

1 голос
/ 14 июня 2010

Вот пример кода, который может вам помочь, используя OpenSSL.

#include <openssl/evp.h>

bool SHA256Hash(const char* buf, size_t buflen, char* res, size_t reslen)
{
    if (reslen >= 32)
    {
        EVP_MD_CTX mdctx;

        EVP_MD_CTX_init(&mdctx);

        EVP_DigestInit_ex(&mdctx, EVP_sha256(), NULL);
        EVP_DigestUpdate(&mdctx, buf, buflen);
        EVP_DigestFinal_ex(&mdctx, res, &len);

        EVP_MD_CTX_cleanup(&mdctx);

        return (len == 32);
    }

    return false;
}

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

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

Если вы ожидаете, что это запретит некоторые функции вашей программы, если не указан какой-либо специальный пароль, тогда это бесполезно: злоумышленник, скорее всего, удалит весь код проверки пароля вместо того, чтобы пытаться угадать или отменить сохраненный пароль. 1010 *

0 голосов
/ 14 июня 2010

Попробуйте узнать функции хеширования и методы шифрования для защиты ваших паролей и их хранения.

...