Как зашифровать код python
Перейти к содержимому

Как зашифровать код python

  • автор:

Скрыть код на питоне на компьютере

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

Отслеживать
задан 18 авг 2023 в 9:49
Артур Гильметдинов Артур Гильметдинов
73 7 7 бронзовых знаков
если у пользователя есть доступ к работающему диску, то чем поможет шифрование?
18 авг 2023 в 9:51
Изучайте это направление
18 авг 2023 в 10:05
закинь в докер и держи приложуху там
18 авг 2023 в 10:21

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

18 авг 2023 в 10:27
@Ruslan а при чём тут докер, что-то помешает выковырять код программы из докера?
18 авг 2023 в 10:27

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Самый простой и надежный способ — это скомпилировать ключевые места в сишный модуль через cython .

print('helloword') 
$ cythonize -i test.py 

Получится файлик test.cpython-311-x86_64-linux-gnu.so . Теперь исходники можно удалить из проекта:

$ rm test.py test.c $ python -c "import test" helloword 

Но у пользователя остаётся возможность вызывать функции в вашем коде.

Отслеживать
ответ дан 20 авг 2023 в 19:05
34.7k 3 3 золотых знака 28 28 серебряных знаков 61 61 бронзовый знак

Почитай документацию модуля pyarmor

Отслеживать
ответ дан 5 часов назад
user582550 user582550
29 1 1 бронзовый знак
5 часов назад

Хотя по ссылке можно найти ответ на вопрос, лучше указать здесь самое главное, а ссылку приводить в качестве источника. Если страница, на которую ведет ссылка, будет изменена, ответ-ссылка может стать недействительным. — из очереди проверок

3 часа назад

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

Вот несколько практик и инструментов для обфускации кода на Python:

  1. PyArmor: Это популярный инструмент для обфускации кода Python. Он может обфусцировать часть кода или весь проект, а также поддерживает многие платформы.
  2. Rename переменных и функций: Простейший способ обфускации — это переименование переменных, функций и классов в нечто неинформативное, например, из calculate_total в a1. Удаление комментариев и документации: Хотя это не делает код более трудным для анализа, это убирает полезную информацию, которая может помочь в понимании кода.
  3. Использование строковых операций: Вы можете динамически создавать и выполнять код с помощью функций eval() и exec(). Но будьте осторожны, так как это может создать уязвимости в безопасности.
  4. Упаковка кода: Существуют инструменты, такие как cx_Freeze или PyInstaller, которые позволяют упаковать ваш код в исполняемый файл. Это делает анализ исходного кода более сложным.
  5. Использование компиляции: Вы можете компилировать ваш код в байт-код с помощью модуля py_compile. Это создает файл .pyc, который труднее анализировать, чем исходный код.
  6. Интеграция с C/C++: Если у вас есть критические части кода, которые вы хотите защитить, вы можете реализовать их на C или C++ и вызывать из Python.
  7. Обфускация строк: Строки можно кодировать и декодировать на лету, чтобы их было труднее найти и понять.
  8. Использование ProGuard для Jython: Если вы используете Jython (Python для JVM), вы можете использовать инструменты обфускации Java, такие как ProGuard.
  9. Избегайте обфускации стандартных библиотек: Это может вызвать проблемы совместимости.

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

Еще несколько практик, кроме обфускации которые могут вам помочь (или на что-то надоумить, т к у многих есть много условий и «за»/»против»:

  1. Использование байт-кода: Python автоматически компилирует исходный код в байт-код (файлы .pyc). Хотя байт-код можно декомпилировать, это добавляет дополнительный шаг в процесс анализа.
  2. Работа с лицензиями: Внедрите систему лицензирования, чтобы ограничить использование вашего продукта только лицензированными пользователями. (К примеры мы привязываемся к железу, т. к. нет выхода в сеть)
  3. Тампер-детекция: Внедрите механизмы, которые определяют, был ли изменен ваш код или исполняемый файл, и предпринимают соответствующие действия (например, завершают выполнение программы).
  4. Защита от отладки: Используйте методы и инструменты, которые обнаруживают попытки отладки вашего кода и прерывают выполнение или вводят злоумышленника в заблуждение.
  5. Криптографическая защита: Шифруйте чувствительные данные или ключевые части кода. Также можно использовать цифровые подписи для проверки целостности кода.
  6. Облачные вычисления: Если возможно, переместите критические части вашего приложения на серверную сторону. Таким образом, конечный пользователь никогда фактически не видит или не имеет доступа к этим частям кода.

PyArmor: как запутать код, чтобы защитить программное обеспечение

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

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

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

Разработчики скриптов знают, что код на 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, Django и немного защиты кода

Привет, Habr! Компания, в которой я работаю, занимается системами умного дома и видеонаблюдения. Услуга работает по форме SaaS. Но недавно было решено продавать и локальное решение. За основу «коробки» было решено взять облако, немного его переделать и вот готов новый продукт…

С переездом с облачных «рельс» возник ряд вопросов. Один из них в том, что весь проект написан на Python‑ язык интерпретируемый на лету и не защищенный от копирования от слова совсем. Второй момент, что в проекте используется Django. Фреймворк со своими зависимостями, которые еще аукнулись нам в процессе поиска решений. То с чем мы столкнулись и к чему пришли далее в статье.

Глава 1. Поиск решения

Как защитить код от изменения и копирования? Как сказал классик: «С этим вопросом я пошел в Интернет». И вот что удалось найти:

Решение 1 — смирись

Многие на форумах на вопрос как защищаетесь отвечают- никак. Аргументируют это тем, что кому надо и так взломают, а у python другая философия. Будь открыт миру и все такое.

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

Решение 2 — перепиши

Второй по популярности ответ- переписать на компилируемый язык программирования. Кроме Python у нас используется Go. Как вариант рассматривали переписать только важную часть на него, но проект настолько монструозный, что переписать его будет долго и дорого. Бизнес не оценил находку…

Решение 3 — отдавай только .pyc файлы

Как и большинство интерпретируемых языков программирования, Python перед выполнением кода переводит его формат байт-кода(такие файлы имеют формат .pyc и лежат в директории __pycache__). Уже этот байт код исполняется интерпретатором. Идея подхода- вручную “скомпилировать” весь код в байт-код. Удалить исходники и запускать pyc файлы.

Плюсы такого метода:

  • Код становится не читаемым
  • Такой код восстанавливается обратно в идентичном виде. Вплоть до названий переменных.
def foo(): """Тестовая функция""" print("Hello, Habr!") if __name__ == "__main__": foo() 
  1. “Компилируем” его
python -m compileall main.py

на выходе получаем

Тут уже подозрительно что мы видим в неизменном виде комментарии и часть функции.

uncompyle6 -o . pycache/main.cpython-38.pyc

Получаем все в исходном виде вплоть до комментариев.

Внимание. Библиотека работает с кодом максимум 3.8 версии.

Итог данного метода. Если вам нужно быстро и хоть как-то защитить код и при этом рисками можно пренебречь- то этот метод для вас. Но нас этот метод не устроил на тот момент.

Решение 4 — Обфускация кода

Обфуска́ция (от лат. obfuscare — затенять, затемнять; и англ. obfuscate — делать не очевидным, запутанным, сбивать с толку) или запутывание кода — приведение исходного кода или исполняемого кода программы к виду, сохраняющему её функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции. [1]

Суть подхода, что мы делаем код не читаемым, меняя понятные названия переменных на кракозябры.

Один из самых популярных проектов для обфускации pyarmor

Программа интересная. На простых скриптах все хорошо, но большой проект не удастся обфусцировать обычной версией — стоит ограничение в 32768 байт. Нужна платная. Проект иностранный, а ситуация сейчас… Эх, ну в общем сами понимаете.

Решение 5. Найти готовое решение по защите.

Тут все просто, в свете последних событий все производители таких решений, что мы нашли ушли из России. Если есть отечественные варианты буду признателен в комментариях.

Глава 2. Свой импортер и загрузчик

Перебрав предыдущие варианты мы поняли, что нам нужно:

  • Шифровать код, а не обфусцировать/компилировать и т.д его.
  • Метод должен быть простым и минимально затрагивать старый код
  • Должно быть достаточно сложной чтобы дилетанты вовсе не могли сломать, а опытных если не остановить, то хотя бы затруднить взлом.
  • Должен быть прост в поддержке, ибо нанимать/выделять сеньоров для сопровождения сего никто не даст.

После этого я наткнулся на PEP 302 и статью на хабре(какая ирония).

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

Для его реализации нужно реализовать свой класс-импортер или класс-загрузчик(зависит от задачи), добавить в sys.path_hooks и все. Должно заработать.

Ура! — воскликнул я. Вот и решение.

Собрал небольшой пет-проект и вуаля- все работает.

Глава 3. Не все так просто как казалось…

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

Первый заработал без сучка и без задоринки. Если не считать некоторые проблемы с тестами проект работал.

Настало время второго проекта…

Во втором проекте в одной из зависимостей использовался модуль inspect.

Модуль inspect предоставляет несколько полезных функций, помогающих получить информацию о живых объектах, таких как модули, классы, методы, функции, трассировки, объекты фреймов и объекты кода.(Дословный перевод:https://docs.python.org/3/library/inspect.html)

Этот модуль к моему удивлению активно был связан с ядром самого языка, написанном на C, при этом не подчинялся стандартному механизму импорта. После недельной битвы с модулем, понял, что придется идти в Си. НО! Вспомнив 4 пункт с ограничениями остановился. Сишников в команде нет, а подкладывать такую свинью коллегам не хочется.

Эпилог

Увы и ах! Но после двух недель изысканий мы остановились на первом варианте, а как альтернативу вариант с “компилированием” в pyc-файлы. Юристы пошли дописывать дополнительные пункты в договор, а мы продумывать что в перспективе переписать на GO.

Какой урок я вынес? Простыми способами Python не защитить, теперь я могу сказать это испытав на своей шкуре. Если у читателя есть навыки и желания, можно окунуться в дебри СИшного кода, но это уже другая история…

Шифрование набора инструментов Python

По умолчанию набор инструментов Python ( .pyt ) – это текстовой файл, который можно редактировать в любом текстовом редакторе или в среде разработки Python IDE. Однако в некоторых случаях может потребоваться скрыть исходный код набора инструментов Python.

Чтобы зашифровать набор инструментов Python, щелкните на нем правой кнопкой мыши и выберите Зашифровать . При вводе и подтверждении пароля можно сохранить резервную копию исходного файла .pyt .

Внимание:

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

Чтобы зашифровать набор инструментов Python, щелкните на нем правой кнопкой мыши и выберите Зашифровать .

Также имеются функции ArcPy EncryptPYT и DecryptPYT для шифрования и расшифровки наборов инструментов Python.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *