Яркостью мог управлять 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-ключи не могут изменить значение этого объекта.
Как отмечено в комментарии к ответу pavium , у вас есть два варианта:
К сожалению, если вы приходится прибегать к встраиванию и ключа, и алгоритма в код, ни один из них не является по-настоящему секретным, поэтому вам остается (гораздо более слабая) альтернатива безопасность через неясность . Другими словами, как вы упомянули, вам нужен умный способ скрыть один или оба из них внутри вашего исполняемого файла.
Вот несколько вариантов, хотя вы должны помнить, что ни один из них не является по-настоящему безопасным в соответствии с лучшими методами криптографии, и каждый из них имеет свои недостатки:
printf ()
, который обычно состоит из цифр, букв и знаков препинания. int
, char
, и т. Д. ), возьмите байт где-нибудь внутри каждой переменной после ее инициализации ( к ненулевому значению, конечно) и до его изменения. Сообщите нам, как вы решаете проблему!
Изменить: Вы прокомментировали, что проводите рефакторинг существующего кода, поэтому я предполагаю, что вам не обязательно выбирать ключ самостоятельно. В этом случае выполните двухэтапный процесс: используйте один из вышеуказанных методов для шифрования самого ключа, затем используйте этот ключ для дешифрования данных пользователей.
Я думаю, вы хотите, чтобы это выглядело как инструкции, ваш пример
x [y ++] = 'М'; х [у ++] = 'у'; ...
Сделал бы именно это, длинная последовательность повторяющихся инструкций с небольшими вариациями может выделяться, и это было бы плохо, рассматриваемый байт может быть закодирован в инструкции как есть, и это было бы плохо, поэтому, возможно, метод xor и, возможно, некоторые другие уловки, чтобы этот длинный участок кода не выделялся, возможно, некоторые фиктивные вызовы функций. В зависимости от вашего процессора, например, ARM, очень легко посмотреть на двоичные данные и выбрать инструкции из данных и оттуда (если вы ищете ключ по умолчанию), чтобы, возможно, выбрать, что может быть ключом, потому что это данные, но не ascii, и атакуйте их. Точно так же блок подобных инструкций с изменяющимся непосредственным полем, даже если у вас есть компилятор xor данных с константой.
Вот пример того, что они объяснили, но имейте в виду, что это будет довольно просто взломать любой, кто является «хакером», но остановит детишек с помощью шестнадцатеричного редактора. В приведенном мной примере просто добавляется значение 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;
}
Вы можете закодировать строку, используя тривиальное кодирование, например xor с двоичным кодом 01010101. Никакой реальной защиты, конечно, нет, но препятствует использованию таких инструментов, как строка
.
Если вы сохраните ключ шифрования в обратном порядке («yek noitpyrcne gnorts yM»), а затем измените его в своем коде (String.Reverse), это предотвратит простой поиск в двоичном коде для текст вашего ключа шифрования.
Чтобы повторить мысль, высказанную всеми другими авторами здесь, однако, это практически ничего не даст для вас с точки зрения безопасности.
Это приложение клиент-сервер! Не храните его в самом клиенте, это то место, куда явно будут искать хакеры. Вместо этого добавьте (только для вашего нового клиента) дополнительную функцию сервера (через HTTPS) для получения этого пароля. Таким образом, этот пароль никогда не должен попадать на клиентский диск.
В качестве бонуса исправить сервер позже станет намного проще. Просто отправляйте каждый раз свой пароль с ограничением по времени для каждого клиента. Не забудьте разрешить использование более длинных паролей в вашем новом клиенте.
Технология шифрования достаточно сильна, чтобы защитить важные данные без сокрытия их в двоичном файле.
Или ваша идея использовать двоичный файл для ] замаскировать тот факт, что что-то скрыто?
Это будет называться стеганографией .
Это так же безопасно, как оставить незапертый велосипед в Амстердаме, Нидерланды, недалеко от Центрального вокзала. (Моргните, и оно исчезло!)
Если вы пытаетесь добавить безопасность своему приложению, вы обречены на неудачу с самого начала, поскольку любая схема защиты не сработает. Все, что вы можете сделать, - это усложнить хакеру поиск нужной информации. Тем не менее, несколько уловок:
*) Убедитесь, что строка хранится в вашем двоичном формате как UTF-16.
*) Добавьте в строку числа и специальные символы.
*) Используйте массив из 32- биты целые числа вместо строки! Преобразуйте каждый в строку и объедините их все.
*) Используйте GUID, сохраните его как двоичный и преобразуйте в строку для использования.
А если вам действительно нужен какой-то заранее определенный текст, зашифруйте его и сохраните зашифрованное значение в вашем двоичном файле. Расшифруйте его во время выполнения, где ключ для расшифровки - один из вариантов, о которых я упоминал ранее.
Помните, что хакеры будут склонны взламывать ваше приложение другими способами, кроме этого. Даже специалист по криптографии не сможет сохранить что-то в безопасности. В общем, единственное, что защищает вас, - это прибыль, которую хакер может получить от взлома вашего кода, по сравнению со стоимостью его взлома. (Эти затраты часто составляют просто много времени, но если для взлома вашего приложения требуется неделя и всего 2 дня, чтобы взломать что-то еще, вероятность атаки на что-то еще выше.) Единственное, что защищает вас, - это прибыль, которую хакер может получить от взлома вашего кода, по сравнению с затратами на его взлом. (Эти затраты часто составляют просто много времени, но если для взлома вашего приложения требуется неделя и всего 2 дня, чтобы взломать что-то еще, вероятность атаки на что-то еще выше.) Единственное, что защищает вас, - это прибыль, которую хакер может получить от взлома вашего кода, по сравнению с затратами на его взлом. (Эти затраты часто составляют просто много времени, но если для взлома вашего приложения требуется неделя и всего 2 дня, чтобы взломать что-то еще, вероятность атаки на что-то еще выше.)
Использование GUID практично, если вы храните GUID в его двоичном, а не текстовом формате. GUID имеет длину 16 байт и может генерироваться случайным образом. Таким образом, трудно угадать GUID, который используется в качестве пароля. Но если вам все равно нужно отправить простой текст, GUID можно преобразовать в строковое представление, чтобы оно выглядело как «3F2504E0-4F89-11D3-9A0C-0305E82C3301». (Или в кодировке Base64 как «7QDBkvCA1 + B9K / U0vrQx1A ==».) Но пользователи не увидят в коде никакого простого текста, только некоторые явно случайные данные. Однако не все байты в GUID случайны. В идентификаторах GUID скрыт номер версии. Однако использование GUID - не лучший вариант для криптографических целей. Он рассчитывается либо на основе вашего MAC-адреса, либо с помощью псевдослучайного числа, что делает его разумным предсказуемым. Тем не менее, их легко создавать, их легко хранить, конвертировать и использовать. Создание чего-то более длинного не добавляет ценности, поскольку хакер просто попытается найти другие уловки, чтобы взломать систему безопасности. Это просто вопрос о том, насколько они готовы уделять больше времени анализу двоичных файлов.
В общем, самое важное, что обеспечивает безопасность ваших приложений, - это количество людей, которым это интересно. Если никому нет дела до вашего приложения, то никто и взламывать его не будет. Когда вы лучший продукт с 500 миллионами пользователей,
В вашем примере строка вообще не скрывается; строка по-прежнему отображается в виде серии символов на выходе.
Существует множество способов скрыть строки. Существует простой шифр подстановки , или вы можете выполнить математическую операцию с каждым символом (например, XOR), где результат будет использован для операции следующего символа и т. Д. И т. Д.
Цель будет быть, чтобы получить данные, которые не выглядят как строка, поэтому, например, если вы работаете с большинством западных языков, большинство значений ваших символов будет в диапазоне 32-127, поэтому ваша цель будет для операции чтобы в основном выводить их за из этого диапазона, чтобы они не привлекали внимания.
Скрытие паролей в вашем коде - это безопасность неизвестностью. Это вредно, потому что заставляет вас думать, что у вас есть некоторый уровень защиты, хотя на самом деле у вас очень мало. Если что-то стоит обезопасить, стоит закрепить как следует.
PS: Я знаю, что это не работает. против настоящего хакера, но это много лучше, чем ничего ...
На самом деле, во многих ситуациях нет ничего лучше слабой защиты. По крайней мере, вы точно знаете, где стоите. Вам не нужно быть «настоящим хакером», чтобы обойти встроенный пароль ...
РЕДАКТИРОВАТЬ: В ответ на этот комментарий:
Я знаю о парах ключей, но не приемлемо в этом случае. Я рефакторинг существующее приложение, которое использует Шифрование Blowfish. Зашифрованные данные передается на сервер и расшифровывает сервер данные. Я не могу изменить шифрование алгоритм, потому что я должен предоставить обратная совместимость.
Если вы вообще заботитесь о безопасности, поддержание обратной совместимости - ДЕЙСТВИТЕЛЬНО ПЛОХАЯ причина оставить себя уязвимым со встроенными паролями. ХОРОШО нарушить обратную совместимость с небезопасной схемой безопасности.
Это похоже на то, как уличные дети обнаруживают, что вы оставляете ключ от входной двери под ковриком, но продолжаете делать это, потому что дедушка ожидает найти его там.
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.........
Большое спасибо за ваши ответы!
Однажды я был в таком же неудобном положении. У меня были данные, которые должны были быть в двоичном формате, но не в виде обычного текста. Мое решение состояло в том, чтобы зашифровать данные, используя очень простую схему, которая делала их похожими на остальную часть программы. Я зашифровал его, написав программу, которая взяла строку, преобразовала все символы в код ASCII (с добавлением нулей по мере необходимости, чтобы получить трехзначное число), а затем добавил случайную цифру в начало и конец трехзначного кода. . Таким образом, каждый символ строки был представлен 5 символами (всеми числами) в зашифрованной строке. Я вставил эту строку в приложение как константу, а затем, когда мне нужно было использовать строку, я расшифровал и сохранил результат в переменной, достаточно долго, чтобы сделать то, что мне нужно.
Итак, чтобы использовать ваш пример, "