Как скрыть строку в двоичном коде?

Яркостью мог управлять ACPI или графическим драйвером. Я предполагаю тот, который управляет Вашей яркостью, intel_backlight. Однако Вы могли легкая находка это добавляющий к Вашему/etc/rc.local (прежде чем выйдут 0):

echo 5 > /sys/class/backlight/acpi_video0/brightness

или, альтернативно:

echo 5 > /sys/class/backlight/intel_backlight/brightness

кажется, что Fn-ключи действительно изменяют значение acpi_video0, проблема состоит в том, что объект управления является intel_backlight.

, Если система запускается с параметра ядра acpi_backlight=vendor, объект acpi_video0 заменяется объектом Intel, но затем Fn-ключи не могут изменить значение этого объекта.

64
задан Léo Lam 30 July 2015 в 14:55
поделиться

13 ответов

Как отмечено в комментарии к ответу pavium , у вас есть два варианта:

  • Защитить ключ
  • Защитить алгоритм дешифрования

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

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

  1. Замаскируйте свой ключ как строку, которая обычно появляется в коде. Одним из примеров может быть строка формата оператора printf () , который обычно состоит из цифр, букв и знаков препинания.
  2. Хешируйте некоторые или все сегменты кода или данных при запуске и используйте это в качестве ключа. (Вам нужно быть немного умным, чтобы гарантировать, что ключ не изменится неожиданно!) Это имеет потенциально желательный побочный эффект проверки хешированной части вашего кода при каждом его запуске.
  3. Сгенерируйте ключ во время выполнения из чего-то уникального (и постоянного внутри) системы, например, путем хеширования MAC-адреса сетевого адаптера.
  4. Создайте ключ, выбрав байты из других данных. Если у вас есть статические или глобальные данные, независимо от типа ( int , char , и т. Д. ), возьмите байт где-нибудь внутри каждой переменной после ее инициализации ( к ненулевому значению, конечно) и до его изменения.

Сообщите нам, как вы решаете проблему!

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

47
ответ дан 24 November 2019 в 15:43
поделиться

Я думаю, вы хотите, чтобы это выглядело как инструкции, ваш пример

x [y ++] = 'М'; х [у ++] = 'у'; ...

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

0
ответ дан 24 November 2019 в 15:43
поделиться

Вот пример того, что они объяснили, но имейте в виду, что это будет довольно просто взломать любой, кто является «хакером», но остановит детишек с помощью шестнадцатеричного редактора. В приведенном мной примере просто добавляется значение 80 и вычитается из него индекс, а затем снова создается строка. Если вы планируете сохранить это в двоичном файле, то есть множество способов преобразовать строку в массив byte [].

Когда это работает в вашем приложении, я бы сделал «математику», я использовал немного сложнее

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

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

string Encrypted = EncryptMystring("AAbbBb");
string Decrypted = DecryptMystring(Encrypted);

string DecryptMystring(string RawStr)
    {
        string DecryptedStr = "";
        for (int i = 0; i < RawStr.Length; i++)
        {
            DecryptedStr += (char)((int)RawStr[i] - 80 + i);
        }

        return DecryptedStr;
    }

    string EncryptMystring(string RawStr)
    {
        string EncryptedStr = "";
        for (int i = 0; i < RawStr.Length; i++)
        {
            EncryptedStr += (char)((int)RawStr[i] + 80 - i);
        }

        return EncryptedStr;
    }
2
ответ дан 24 November 2019 в 15:43
поделиться

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

2
ответ дан 24 November 2019 в 15:43
поделиться

Если вы сохраните ключ шифрования в обратном порядке («yek noitpyrcne gnorts yM»), а затем измените его в своем коде (String.Reverse), это предотвратит простой поиск в двоичном коде для текст вашего ключа шифрования.

Чтобы повторить мысль, высказанную всеми другими авторами здесь, однако, это практически ничего не даст для вас с точки зрения безопасности.

2
ответ дан 24 November 2019 в 15:43
поделиться

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

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

3
ответ дан 24 November 2019 в 15:43
поделиться

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

Или ваша идея использовать двоичный файл для ] замаскировать тот факт, что что-то скрыто?

Это будет называться стеганографией .

3
ответ дан 24 November 2019 в 15:43
поделиться

Это так же безопасно, как оставить незапертый велосипед в Амстердаме, Нидерланды, недалеко от Центрального вокзала. (Моргните, и оно исчезло!)

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

*) Убедитесь, что строка хранится в вашем двоичном формате как UTF-16.

*) Добавьте в строку числа и специальные символы.

*) Используйте массив из 32- биты целые числа вместо строки! Преобразуйте каждый в строку и объедините их все.

*) Используйте GUID, сохраните его как двоичный и преобразуйте в строку для использования.

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

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


Ответ на комментарий: UTF-16 будет иметь два байта на символ, поэтому их труднее распознать для пользователей, которые смотрят дамп двоичного файла, просто потому, что между каждой буквой есть дополнительный байт. Однако вы все еще можете видеть слова. UTF-32 был бы даже лучше, потому что он добавляет больше места между буквами. С другой стороны, вы также можете немного сжать текст, изменив схему на 6 бит на символ. Затем каждые 4 символа будут сжаты до трех чисел. Но это ограничит вас до 2x26 букв, 10 цифр и, возможно, пробела и точки, чтобы получить 64 символа.

Использование GUID практично, если вы храните GUID в его двоичном, а не текстовом формате. GUID имеет длину 16 байт и может генерироваться случайным образом. Таким образом, трудно угадать GUID, который используется в качестве пароля. Но если вам все равно нужно отправить простой текст, GUID можно преобразовать в строковое представление, чтобы оно выглядело как «3F2504E0-4F89-11D3-9A0C-0305E82C3301». (Или в кодировке Base64 как «7QDBkvCA1 + B9K / U0vrQx1A ==».) Но пользователи не увидят в коде никакого простого текста, только некоторые явно случайные данные. Однако не все байты в GUID случайны. В идентификаторах GUID скрыт номер версии. Однако использование GUID - не лучший вариант для криптографических целей. Он рассчитывается либо на основе вашего MAC-адреса, либо с помощью псевдослучайного числа, что делает его разумным предсказуемым. Тем не менее, их легко создавать, их легко хранить, конвертировать и использовать. Создание чего-то более длинного не добавляет ценности, поскольку хакер просто попытается найти другие уловки, чтобы взломать систему безопасности. Это просто вопрос о том, насколько они готовы уделять больше времени анализу двоичных файлов.

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

7
ответ дан 24 November 2019 в 15:43
поделиться

В вашем примере строка вообще не скрывается; строка по-прежнему отображается в виде серии символов на выходе.

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

Цель будет быть, чтобы получить данные, которые не выглядят как строка, поэтому, например, если вы работаете с большинством западных языков, большинство значений ваших символов будет в диапазоне 32-127, поэтому ваша цель будет для операции чтобы в основном выводить их за из этого диапазона, чтобы они не привлекали внимания.

8
ответ дан 24 November 2019 в 15:43
поделиться

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

PS: Я знаю, что это не работает. против настоящего хакера, но это много лучше, чем ничего ...

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

РЕДАКТИРОВАТЬ: В ответ на этот комментарий:

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

Если вы вообще заботитесь о безопасности, поддержание обратной совместимости - ДЕЙСТВИТЕЛЬНО ПЛОХАЯ причина оставить себя уязвимым со встроенными паролями. ХОРОШО нарушить обратную совместимость с небезопасной схемой безопасности.

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

11
ответ дан 24 November 2019 в 15:43
поделиться

I Прошу прощения за длинный ответ.

Ваши ответы абсолютно верны, но вопрос был в том, как скрыть строку и сделать это красиво.

Я сделал это таким образом:

#include "HideString.h"

DEFINE_HIDDEN_STRING(EncryptionKey, 0x7f, ('M')('y')(' ')('s')('t')('r')('o')('n')('g')(' ')('e')('n')('c')('r')('y')('p')('t')('i')('o')('n')(' ')('k')('e')('y'))
DEFINE_HIDDEN_STRING(EncryptionKey2, 0x27, ('T')('e')('s')('t'))

int main()
{
    std::cout << GetEncryptionKey() << std::endl;
    std::cout << GetEncryptionKey2() << std::endl;

    return 0;
}

HideString.h:

#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/seq/enum.hpp>

#define CRYPT_MACRO(r, d, i, elem) ( elem ^ ( d - i ) )

#define DEFINE_HIDDEN_STRING(NAME, SEED, SEQ)\
static const char* BOOST_PP_CAT(Get, NAME)()\
{\
    static char data[] = {\
        BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_FOR_EACH_I(CRYPT_MACRO, SEED, SEQ)),\
        '\0'\
    };\
\
    static bool isEncrypted = true;\
    if ( isEncrypted )\
    {\
        for (unsigned i = 0; i < ( sizeof(data) / sizeof(data[0]) ) - 1; ++i)\
        {\
            data[i] = CRYPT_MACRO(_, SEED, i, data[i]);\
        }\
\
        isEncrypted = false;\
    }\
\
    return data;\
}

Самая сложная строка в HideString.h:

BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_FOR_EACH_I(CRYPT_MACRO, SEED, SEQ))

Позвольте мне пояснить строку. Для кода:

DEFINE_HIDDEN_STRING(EncryptionKey2, 0x27, ('T')('e')('s')('t'))

BOOST_PP_SEQ_FOR_EACH_I(CRYPT_MACRO, SEED, SEQ)
сгенерируйте последовательность:
( 'T'  ^ ( 0x27 - 0 ) ) ( 'e'  ^ ( 0x27 - 1 ) ) ( 's'  ^ ( 0x27 - 2 ) ) ( 't'  ^ ( 0x27 - 3 ) )

BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_FOR_EACH_I(CRYPT_MACRO, SEED, SEQ))
генерировать:
'T' ^ ( 0x27 - 0 ), 'e' ^ ( 0x27 - 1 ), 's' ^ ( 0x27 - 2 ), 't' ^ ( 0x27 - 3 )

и, наконец,

DEFINE_HIDDEN_STRING(EncryptionKey2, 0x27, ('T')('e')('s')('t'))
генерируют:
static const char* GetEncryptionKey2()
{
    static char data[] = {
        'T' ^ ( 0x27 - 0 ), 'e' ^ ( 0x27 - 1 ), 's' ^ ( 0x27 - 2 ), 't' ^ ( 0x27 - 3 ),
        '\0'
    };
    static bool isEncrypted = true;
    if ( isEncrypted )
    {
        for (unsigned i = 0; i < ( sizeof(data) / sizeof(data[0]) ) - 1; ++i)
        {
            data[i] = ( data[i] ^ ( 0x27 - i ) );
        }
        isEncrypted = false;
    }
    return data;
}

данные для «Мой надежный ключ шифрования» выглядят так:

0x00B0200C  32 07 5d 0f 0f 08 16 16 10 56 10 1a 10 00 08  2.]......V.....
0x00B0201B  00 1b 07 02 02 4b 01 0c 11 00 00 00 00 00 00  .....K.........

Большое спасибо за ваши ответы!

51
ответ дан 24 November 2019 в 15:43
поделиться
  1. Опубликовать как проблему с кодом для гольфа
  2. Дождитесь решения, написанного на J
  3. Вставьте J-интерпретатор в свое приложение
20
ответ дан 24 November 2019 в 15:43
поделиться

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

Итак, чтобы использовать ваш пример, "

4
ответ дан 24 November 2019 в 15:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: