Защита Python приложений
Первый вариант защищает Python приложения, комбинируя Sentinel Envelope с Sentinel Data File Protection (DFP). Таким образом, защищается непосредственно интерпретатор Python, которому на уровне защиты указывается, с какими файлами он должен работать как с защищенными (зашифрованными), следовательно, такие файлы интерпретатор будет предварительно автоматически расшифровывать и только затем выполнять. Незашифрованные файлы будут работать также, как и ранее. Сами *.py модули, требующие защиты шифруются с помощью инструмента Sentinel Data File Protection (DFP).
Второй вариант подразумевает защиту Python приложений, комбинируя Cython (https://cython.org/) с Sentinel Envelope. Сначала необходимо требующие защиты модули Python перевести в C-Code с помощью Cython и затем скомпилировать их в модули *.pyd / *.so, которые в последствие защищаются с помощью Sentinel Envelope.
Второй метод обеспечивает более высокий уровень безопасности, поскольку дополнительный этап компиляции снижает уровень абстракции кода и позволяет Sentinel Envelope защищать приложение как код, а не только как данные, что позволяет применять более сложные механизмы защиты. С другой стороны, второй метод немного сложнее в настройке, так как требует дополнительно “прослойки” в виде Cython и работающий C-компилятор.
- 1 Метод #1: защита через шифрование данных (Sentinel Data File Protection)
- 1.1 Примеры защиты
- 1.1.1 Для Windows
- 1.1.2 Для Linux
- 1.2.1 Сборка приложения и зависимостей в *.py модуль
- 1.2.2 Шифрование *.py модулей
- 1.2.3 Защита интерпретатора Python
- 2.1 Примеры защиты
- 2.1.1 Для Windows
- 2.1.2 Для Linux
- 2.2.1 Трансляция *.py модулей в C-Code с использованием Cython
- 2.2.2 Сборка C-Файлов в нативное Python приложение (исполняемый файл)
- 2.2.3 Защита нативного Python приложения (исполняемого файла) с помощью утилиты Envelope
Метод #1: защита через шифрование данных (Sentinel Data File Protection)
Защита приложения Python с помощью Sentinel Data File Protection состоит из трех этапов:
● Соберите ваше приложение в модули байт-кода *.pyc.
● Зашифруйте получившиеся файлы *.pyc с помощью утилиты Sentinel dfcrypt.● Защитите интерпретатор Python, включив в настройках защиты опцию “Enable data file protection (Data Protection Utility) = Version 2” для работы защищённого интерпретатора с зашифрованными файлами данных. Защищенное приложение может распространяться путем упаковки защищенного с помощью Envelope интерпретатора вместе с зашифрованными *.pyc файлами (например, с использованием pyinstaller).
Примечание: Важно всегда защищать скомпилированный байт-код Python (*.pyc), а не простой исходный код Python (.py). Причина в том, что интерпретатор Python сначала переводит файлы *.py в файлы *.pyc, которые затем записываются на диск, чтобы ускорить последующее выполнение. При предоставлении защищенного файла *.py вместо файла *.pyc интерпретатор Python сгенерирует открытый текстовый файл *.pyc и запишет его на диск, где он будет доступен для анализа в открытом виде.
Примеры защиты
Для Windows
После установки Sentinel LDK пример, демонстрирующий защиту Python приложения для Windows с помощью Sentinel Data File Protection, можно найти в директории:
C:\Users\\Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \data_file_protection
Прилагаемые скрипты демонстрируют защиту простого Python приложения, которое можно найти в директории:
C:\Users\\Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \sample_app
Пример представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3. Директория data_file_protection содержит:
● build_dfp_protected_python2_app.bat
Этот сценарий защищает и упаковывает пример приложения для Python2 для Windows, с использованием: кода разработчика DEMOMA, Sentinel Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.
● envelope_python2.prjx
Файл проекта Sentinel Envelope, в котором указаны параметры Envelope для защиты интерпретатора Python2 (python27.dll) для приведенного выше сценария.
● build_dfp_protected_python3_app.bat
Этот сценарий защищает и упаковывает пример приложения для Python3 для Windows, с использованием: кода разработчика DEMOMA, Sentinel Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.● envelope_python3.prjx
Файл проекта Sentinel Envelope, в котором указаны параметры Envelope для защиты интерпретатора Python3 (python37.dll) для приведенного выше сценария.Для Linux
Пример, демонстрирующий защиту Python приложения для Linux с использованием Sentinel Data File Protection, можно найти в директории:
/Linux/Samples/Envelope/Python/data_file_protection
Прилагаемые скрипты демонстрируют защиту простого Python приложения, которое можно найти в директории:
/Linux/Samples/Envelope/Python/sample_app
Пример представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3.Директория data_file_protection содержит:
● build_dfp_protected_python2_app.sh
Этот сценарий защищает и упаковывает пример приложения для Python2 для Linux с использованием: кода разработчика DEMOMA, Sentinel Linux Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.● build_dfp_protected_python3_app.sh
Этот сценарий защищает и упаковывает пример приложения для Python3 для Linux с использованием: кода разработчика DEMOMA, Sentinel Linux Envelope, утилиты шифрования файлов данных для Sentinel LDK (dfcrypt) и pyinstaller.Процесс защиты
Шаги для создания защищенного приложения с использованием Sentinel Data File Protection и Sentinel Envelope:
Сборка приложения и зависимостей в *.py модуль
Запустите pyinstaller с параметрами: «-d noarchive» для требующего защиты*.py модуля, например:
pyinstaller -d noarchive main.pyЭтот шаг собирает зависимости вашего приложения и компилирует их в байт-код Python. «-d noarchive» инструктирует pyinstaller хранить скомпилированные модули Python как отдельные файлы, что является обязательным требованием для следующего шага шифрования.Результатом этого шага является автономная папка (dist/
), содержащая ваше приложение и все его зависимости.Примечание: Если установленный pyinstaller не поддерживает ключ «-d noarchive», он слишком стар и его необходимо обновить с помощью команды pip:pip install pyinstaller —upgrade
Шифрование *.py модулей
Используйте dfcrypt для шифрования чувствительных модулей байт-кода вашего приложения, например:
dfcrypt —encrypt —encver:2 «—key:A secret» —vcf:DEMOMA.hvc —fid:0 dist//moduleA.pyc encrypted/moduleA.pyc
dfcrypt —encrypt —encver:2 «—key:a secret» —vcf:DEMOMA.hvc —fid:0 dist//moduleB.pyc encrypted/moduleB.pyc
Хотя это и не является строго обязательным, рекомендуется использовать ключ «—key:» для указания общего ключа шифрования для всех модулей приложения. Это позволяет использовать логику кэширования, которая может существенно улучшить время запуска приложения, использующего большое количество защищенных модулей. Не указывая «—key:», команда dfcrypt выбирает случайный ключ для каждого файла.Когда закончите с шифрованием, замените исходные файлы их зашифрованным аналогом, например:
copy encrypted/moduleA.pyc dist//
copy encrypted/moduleB.pyc dist//Защита интерпретатора Python
Защитите с помощью Envelope библиотеку интерпретатора Python (*.dll / *.so) с поддержкой возможности чтения зашифрованных файлов данных:
Например в Linux и Python2:
linuxenv —vcf:DEMOMA.hvc —fid:0 —dfp dist//libpython2.7.so.1.0 dist//libpython2.7.so.1.0
Ключ «—dfp» активирует Data File Protection, что позволяет защищенному интерпретатору Python выполнять зашифрованные модули Python.
В Windows используйте Sentinel Envelope и активируйте Data File Protection Version 2.
Скопируйте выходные файлы Envelope в директорию:Чтобы развернуть защищенное приложение, просто скопируйте папку dist/ на целевой компьютер.Ваше защищенное приложение можно запустить, выполнив команду вида:
Метод #2: экспорт модулей через Cython и защита с помощью Sentinel Envelope
- Переведите ваши модули Python (*.py) в C-Code, используя Cython.
- Скомпилируйте полученные C-файлы в модули расширения Python (*.pyd / *.so), используя C-компилятор для вашей платформы 1 .
- Защитите полученные модули расширения Python (*.pyd / *.so) с помощью Sentinel Envelope.
Примеры защиты
Для Windows
После установки Sentinel LDK пример, демонстрирующий защиту приложения Python для Windows с использованием Cython и Sentinel Envelope, можно найти в директории:
C:\Users\\Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \cythonize_and_envelope
Скрипты демонстрирующие защиту простого приложения Python, которое можно найти в директории:
C:\Users\
\Documents\Gemalto\Sentinel LDK version\Samples\Envelope\Python \sample_app Пример приложения представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3.
Директория cythonize_and_envelope содержит:
● build_python2.bat Этот сценарий защищает и упаковывает пример приложения для Python2 под Windows, с использованием: кода разработчика DEMOMA, Cython, компилятора Microsoft Visual C ++ для Python 2.7, Sentinel Envelope и pyinstaller.
● envelope_cythonized_py2modules.prjx
Файл проекта Sentinel Envelope, который задает параметры Envelope для защиты расширений Python (moduleA.pyd, moduleB.pyd), которые были созданы с помощью приведенного выше сценария.● build_python3.bat Этот сценарий защищает и упаковывает пример приложения для Python3 под Windows, с использованием: кода разработчика DEMOMA, Cython, Microsoft Build Tools для Visual Studio 2019, Sentinel Envelope и pyinstaller.
● envelope_cythonized_py3modules.prjx
Файл проекта Sentinel Envelope, который задает параметры Envelope для защиты расширений Python (moduleA.pyd, moduleB.pyd), которые были созданы с помощью приведенного выше сценария.Для Linux
Пример защиты приложения Python для Linux с использованием Cython и Sentinel Envelope можно найти в директории:
/Linux/Samples/Envelope/Python/cythonize_and_envelope
Прилагаемые скрипты демонстрируют защиту простого приложения Python, которое можно найти в директории:
/Linux/Samples/Envelope/Python/sample_app
Пример представляет собой простое Python приложение командной строки, которое состоит из сценария запуска (main.py) и 3’х модулей (moduleA.py, moduleB.py, moduleC.py). Этот пример был написан так, чтобы работать одинаково в обеих версиях Python2 и Python3.
Директория cythonize_and_envelope содержит:
● build_python2.sh
Этот сценарий защищает и упаковывает приложение для Python2 под Linux с использованием: кода разработчика DEMOMA, Cython, GCC, Sentinel Envelope и pyinstaller.● build_python3.sh
Этот сценарий защищает и упаковывает приложение для Python3 под Linux с использованием: кода разработчика DEMOMA, Cython, GCC, Sentinel Envelope и pyinstaller.Процесс защиты
Шаги для создания защищенного приложения с использованием Cython и Sentinel Envelope:
Трансляция *.py модулей в C-Code с использованием Cython
Для защиты необходимо сначала изменить расширение вашего модуля Python с *.py на *.pyx, потому что это позволяет Cython генерировать код, который может быть лучше защищен с помощью Sentinel Envelope.Cython может быть установлен с использованием команды
pip:pip install cython —upgrade
Запустите cython и укажите, должен ли он обрабатывать код как Python 2 или Python 3:
cython -2 —no-docstrings .\moduleA.pyx
cython -3 —no-docstrings .\moduleA.pyx
Результатом является представление модуля Python в виде C-кода ( moduleA.c).Сборка C-Файлов в нативное Python приложение (исполняемый файл)
Для Windows:Установите требуемый компилятор:
● Python2: Microsoft Visual C++ Compiler для Python 2.7
● Python3: Microsoft Build Tools для Visual Studio 2019 https://visualstudio.microsoft.com/ru/downloads/
Запустите консоль (cmd-shell) и выполните команду:
● Python2: C:\Users\\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\vcvarsall.bat» amd64
● Python3: C:\\VC\Auxiliary\Build\vcvarsall.bat» amd64
Выполните следующие команды в консоли, чтобы скомпилировать C-код:
● Python2: cl /nologo /c /MD /Ox /W3 /I C:\Python27\include moduleA.c link /nologo /dll -out:moduleA.pyd C:\Python27\libs\python27.lib moduleA.obj
● Python3: cl /nologo /c /MD /Ox /W3 /IC:\Python37\include moduleA.c link /nologo /dll -out:moduleA.pyd C:\Python37\libs\python37.lib moduleA.obj
В результате получите модуль расширения Python для Windows (moduleA.pyd).Для Linux:
Установите GCC-Compiler с помощью менеджера пакетов вашего дистрибутива Linux, например следующей командой в консоли:
apt install gcc
Установите пакет разработчика Python, используя менеджер пакетов вашего дистрибутива Linux, например:
apt install python2-dev
apt install python3-dev
Выполните следующие команды, чтобы скомпилировать C-код:
● Python2: gcc -fPIC -pthread -fwrapv -O2 -Wall -fno-strict-aliasing -I/usr/include/python2.7 -c moduleA.c gcc -pthread -shared moduleA.o -o moduleA.so
● Python3: gcc -fPIC -pthread -fwrapv -O2 -Wall -fno-strict-aliasing -I «/usr/include/python3.7» -c moduleA.c gcc -pthread -shared moduleA.o -o moduleA.so
В результате получите модуль расширения Python для Linux (moduleA.so).
Защита нативного Python приложения (исполняемого файла) с помощью утилиты Envelope
Пример команды для защиты для Linux:
linuxenv —vcf:DEMOMA.hvc —fid:0 plain/moduleA.so prot/moduleA.so
Для Windows используйте Sentinel Envelope точно так же, как при защитите обычного dll/exe файла.
Шифрование набора инструментов Python
По умолчанию набор инструментов Python ( .pyt ) – это текстовой файл, который можно редактировать в любом текстовом редакторе или в среде разработки Python IDE. Однако в некоторых случаях может потребоваться скрыть исходный код набора инструментов Python.
Чтобы зашифровать набор инструментов Python, щелкните на нем правой кнопкой мыши и выберите Зашифровать . При вводе и подтверждении пароля можно сохранить резервную копию исходного файла .pyt .
Внимание:
Шифрование набора инструментов Python производится непосредственно для самого файла, и исходный незашифрованный файл будет переписан. Создание резервной копии исходного набора инструментов Python рекомендуется на случай, если вы забудете пароль.
Чтобы зашифровать набор инструментов Python, щелкните на нем правой кнопкой мыши и выберите Зашифровать .
Также имеются функции ArcPy EncryptPYT и DecryptPYT для шифрования и расшифровки наборов инструментов Python.
PyArmor: как запутать код, чтобы защитить программное обеспечение
Все еще не шифруете свой скрипт? Тогда самое время изучить обфускацию. Сегодня познакомлю с полезной библиотекой PyArmor, расскажу о двух методах работы модуля и на собственном примере покажу, как запутать код от нежелательного просмотра третьими лицами.
17 показов
4.2K открытийВ повседневной работе существуют ситуации, когда по очевидным причинам необходимо предоставить скрипты заказчику, но, пересылая собственные разработки, в полном объеме можно потерять контроль над ними, включая авторские права на реализованные коды.
В таких случаях целесообразно защитить собственные коды, зашифровав их (защитить/сохранить/добавить условия для управления зависимостями внутри кода), точно также, как если бы стояла задача предоставления кода для пользования клиенту в течение какого-либо определенного периода времени.
Разработчики скриптов знают, что код на Python поддерживает анализ байт-кода, позволяющий ускорять работу интерпретатора и сам код на Python очень сложно защитить от нежелательного просмотра третьими лицами. Даже новички в разработке скриптов на Python могут заполучить исходный скрипт .py из файла .exe.
Для этого случая на Python существует очень полезная библиотека pyarmor с помощью которой можно воспользоваться всеми вышеизложенными функциями защиты скрипта от нежелательного взлома и метод, который позволяет защитить код называется обфускация.
Библиотека PyArmor имеет несколько вариантов работы – через консоль, а также с использованием localhost GUI – графического пользовательского интерфейса.
Установка и использование библиотеки pyarmor
В консоли необходимо выполнить следующую команду, чтобы установить модуль:
pip install pyarmor
Для того чтобы начать работу с графическим интерфейсом библиотеки необходимо сперва его установить, выполнив следующую команду:
pip install pyarmor—webui
Библиотеки успешно установлены, теперь можно приступить непосредственно к самому шифрованию скрипта.
В первую очередь необходимо создать отдельную папку, в которой будет храниться скрипт с кодом «my_script.py».
В качестве примера скрипта возьму самый простейший скрипт с математическими функциями и с определением функции вывода (функция вывода довольно проста и не нуждается в каких-либо пояснениях):
def math_primer1(x, y): return x + y * x * y def math_primer2(x, y): return x * y ** (x + y) if __name__ == «__main__»: result1 = math_primer2(2, 3) result2 = math_primer1(1, 2) print(result1, result2)
Теперь зашифрую этот код, выполнив в консоли несколько команд.
Для начала необходимо изменить путь до директории в которой лежит файл через:
cd [Полный путь до файла my_script.py]
Затем необходимо выполнить команду обфускации:
Кодировки и шифрование¶
Кодировка — это правила перевода одного набора символов в другой. В отношении компьютерных программ речь идёт о правилах кодирования последовательности из нулей и единиц в текст, число или что-либо другое.
Наиболее распространённые кодировки
Обозначение в python
Латинские буквы, цифры и простые символы
Кириллическая кодировка (русский и другие языки)
Кодировка для русского языка
Юникод-кодировка, все языки (длина символа — 8 бит)
Юникод-кодировка, все языки (длина символа — 16 бит)
Unicode — стандарт кодирования символов, включающий в себя знаки почти всех письменных языков мира. В настоящее время стандарт является преобладающим в Интернете.
- стандарт включает более 138 тысяч символов;
- каждый символ имеет определённое название и код (номер);
- коды состоят из латинских букв и шестнадцатеричных цифр, например: U+0073 .
Примеры кодов, имен и соответствующих символов:
- U+0073 , «LATIN SMALL LETTER S» — s
- U+1F383 , «JACK-O-LANTERN» —
- U+2615 , «HOT BEVERAGE» — ☕
Конвертация данных между байтам и строками¶
Данные по сети передаются, как правило, в байтах. Например, метод socket.recv() получает данные в байтах. Чтобы преобразовывать данные из байт в строки и наоборот используются специальные методы:
- метод encode(‘encoding_name’) — позволяет перевести данные из строки в байты (str -> bytes);
- метод decode(‘encoding_name’) — позволяет перевести данные из байт в строку (bytes -> str);
В коде будет выглядеть так:
# кодирование строки в байты s = 'привет' s_bytes = s.encode ('utf-8') print (s_bytes) Out: b'\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' # декодирование байт в строку s_dec = s_bytes.decode ('utf-8') print (s_dec) Out: привет
При работе с кодировкой важно помнить:
- Если вы кодируете строку в байты кодировкой UTF-8, то и перекодировать её из байт нужно этой же кодировкой. Некоторые кодировки совместимы, но в большинстве случаев, нарушения этого правила ведёт к потере данных.
- В своём коде всегда используйте кодировки Unicode, оптимально UTF-8, она используется по умолчанию в большинстве методов и функций, так что это снижает риск ошибок.
- Декодирование байтовых данных в строки лучше производить сразу после их получения, а кодирование в байты — только перед отправкой. В коде лучше работать с привычными типами данных (строки, списки, числа), не с байтами, ведь большинство методов в Python с байтовыми строками не работают (или работают не так, как можно ожидать).
Шифрование¶
Шифр Цезаря
Шифр Цезаря — это вид шифра подстановки, в котором каждый символ в открытом тексте заменяется символом, находящимся на некотором постоянном числе позиций левее или правее него в алфавите. Например, в шифре со сдвигом вправо на 3, A была бы заменена на D, B станет E, и так далее.
Повторить шифр можно в занятии
Формула для кодирования символа:
symbol_encoded = ((((symbol) - first + key) % size) + first)
Шифр пар
Алфавит случайным образом записывают в 2 строки, и шифрование текста происходит заменой буквы на соседнюю ей по вертикали. Например:
['v', 'q', 'f', 's', 'p', 'u', 'n', 'a', 'm', 'j', 'c', 'k', 'h'] ['l', 'r', 'o', 'e', 'x', 'd', 'z', 'g', 'b', 'w', 't', 'i', 'y'] In: hello Out: ysvvf
Шифр Виженера
На алфавите длиной N вводят операцию добавления (циклического сдвига) букв. Пронумеровав буквы, добавляем их по модулю N (для англ. алфавита N=26).
Выбираем слово-ключ (пускай pass) и подписываем его под сообщением сколько нужно раз:
Сообщение: search Ключ: passpa Шифр: hesjrh
Задания¶
- Доработайте прототип чата из прошлого урока таким образом, чтобы он корректно работал с русским языком (используйте методы кодирования и декодирования байтовых строк).
2. Напишите функцию для шифрования файла шифром Цезаря. Расшифруйте:
key = 2 s = 'Oquv uvctu ctg qdugtxgf vq dg ogodgtu qh dkpctb uvct ubuvgou'
3. Напишите функцию для шифрования файла шифром пар. Расшифруйте:
d_1 = [109, 122, 106, 115, 100, 99, 105, 120, 110, 98, 121, 118, 107] d_2 = [112, 103, 108, 104, 111, 102, 119, 117, 97, 101, 116, 113, 114] s = 'A hynk wh na nhykdadpwfnj delbfy fdahwhywaz dc n jxpwadxh hmsbkdwo dc mjnhpn sbjo ydzbysbk et wyh dia zknqwyt.'
4.* Напишите функцию для шифрования файла шифром Виженера. Расшифруйте. 5. Добавьте в чат (с кодировкой) возможность выполнять шифрование и дешифрование сообщения одним из шифров по выбору пользователя. 6. Доработайте чат таким образом, чтобы пользователь отправлял серверу имя зашифрованного файла и шифр, а сервер дешифровал его и отправлял содержимое файла обратно пользователю.
Полезные ссылки¶
- Шифр подстановки
- Элементарная криптография
- 1.1 Примеры защиты