Как защитить код Python? - PullRequest
       103

Как защитить код Python?

585 голосов
/ 04 ноября 2008

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

Если мы распространяем файлы .py или даже файлы .pyc, будет легко (декомпилировать и) удалить код, проверяющий файл лицензии.

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

Есть ли хороший способ справиться с этой проблемой? Желательно с готовым решением.

Программное обеспечение будет работать в системах Linux (поэтому я не думаю, что py2exe справится с задачей).

Ответы [ 27 ]

14 голосов
/ 05 ноября 2008

Хотя идеального решения не существует, можно сделать следующее:

  1. Переместите некоторый критический фрагмент кода запуска в собственную библиотеку.
  2. Обеспечить проверку лицензии в собственной библиотеке.

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

Хотя это не кроссплатформенное или чисто Python-решение, оно будет работать.

10 голосов
/ 03 июля 2012

Я думаю, что есть еще один способ защитить ваш код Python; часть метода запутывания. Я полагаю, что была такая игра, как Mount and Blade или что-то, что изменило и перекомпилировало их собственный интерпретатор python (оригинальный интерпретатор, который, я считаю, с открытым исходным кодом) и просто изменило коды OP в таблице кодов OP, чтобы они отличались от стандартных OP Python. коды.

Таким образом, исходный код python не изменен, но расширения файлов * .pyc отличаются, и коды операций не соответствуют общедоступному интерпретатору python.exe. Если вы проверили файлы данных игр, все данные были в исходном формате Python.

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

Вы можете, например, в измененном интерпретаторе разрешить ему проверять наличие определенных комментариев или строк документации в вашем источнике. Вы можете иметь специальные OP-коды для таких строк кода. Например:

OP 234 для строки исходного текста "# Авторские права я написал это" или скомпилируйте эту строку в коды операций, которые эквивалентны «if False:», если отсутствует «# Copyright». По сути, отключение целого блока кода по неясной причине.

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

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

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

10 голосов
/ 04 ноября 2008

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

9 голосов
/ 01 сентября 2017

Использование Cython . Он скомпилирует ваши модули в высокопроизводительные C-файлы, которые затем могут быть скомпилированы в собственные двоичные библиотеки. По сути это необратимый код по сравнению с байт-кодом .pyc!

Я написал подробную статью о том, как настроить Cython для проекта Python, ознакомьтесь:

Защита источников Python с помощью Cython

9 голосов
/ 04 ноября 2008

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

Лучшим решением будет продажа кода в качестве службы, скажем, путем размещения службы или предоставления поддержки - хотя это не всегда практично.

Отправка кода в виде .pyc файлов предотвратит сбои вашей защиты на несколько # с, но вряд ли это эффективная защита от пиратства (как если бы была такая технология), и в конце дня не должно достигать ничего, чего достигнет приличное лицензионное соглашение с компанией.

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

8 голосов
/ 06 мая 2009

Другая попытка усложнить кражу вашего кода - использовать jython, а затем использовать java obfuscator .

Это должно работать очень хорошо, так как jythonc переводит код Python в Java, а затем Java компилируется в байт-код. Так что, если вы запутаете классы, будет очень трудно понять, что происходит после декомпиляции, не говоря уже о восстановлении реального кода.

Единственная проблема с Jython заключается в том, что вы не можете использовать модули Python, написанные на языке c.

6 голосов
/ 04 ноября 2008

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

6 голосов
/ 17 марта 2018

Я был удивлен, не увидев пиконкрет ни в одном ответе. Может быть, потому что это новее, чем вопрос?

Это может быть именно то, что вам нужно (ред.).

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

С страница Pypi :

Защита рабочего процесса сценария Python

  • your_script.py import pyconcrete
  • Pyconcrete подключит модуль импорта
  • когда ваш скрипт импортирует MODULE, хук импорта pyconcrete попытается сначала найти MODULE.pye, а затем расшифровать MODULE.pye через _pyconcrete.pyd и выполнить расшифрованные данные (как .pyc content)
  • шифровать и дешифровать запись секретного ключа в _pyconcrete.pyd (например, DLL или SO) секретный ключ будет скрыт в двоичном коде, не может увидеть его непосредственно в режиме HEX
6 голосов
/ 04 ноября 2008

А как насчет подписи вашего кода стандартными схемами шифрования путем хеширования и подписывания важных файлов и проверки его методами открытого ключа?

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

Дополнительно вы можете использовать обфускатор Python, такой как этот (просто погуглил его).

5 голосов
/ 04 ноября 2008

Лучшее, что вы можете сделать с Python, - это затемнять вещи.

  • Удалите все строки документов
  • Распространять только скомпилированные файлы .pyc.
  • заморозить
  • Затенить ваши константы внутри класса / модуля, чтобы help (config) не показывал все

Вы можете добавить некоторую дополнительную неизвестность, зашифровав ее часть и расшифровав на лету и передав ее в eval (). Но что бы ты ни делал, кто-то может сломать это.

Ничто из этого не остановит решительного злоумышленника от дизассемблирования байт-кода или копания в вашем API с помощью help, dir и т. Д.

...