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

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

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

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

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

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

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

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

Ответы [ 27 ]

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

"Есть ли хороший способ справиться с этой проблемой?" Нет. Ничто не может быть защищено от обратного проектирования. Даже микропрограммное обеспечение на DVD-дисках было переработано и было открыто ключ шифрования AACS . И это несмотря на то, что DMCA считает это уголовным преступлением.

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

  1. Лицензии. Контракты. Условия и положения. Это все еще работает, даже когда люди могут читать код. Обратите внимание, что некоторые из ваших компонентов на основе Python могут потребовать уплаты сборов перед продажей программного обеспечения с использованием этих компонентов. Кроме того, некоторые лицензии с открытым исходным кодом запрещают вам скрывать источник или происхождение этого компонента.

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

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

  4. Предложите индивидуальные настройки по привлекательным ценам, так что они скорее заплатят, что вы создадите и поддержите улучшения.

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

  6. Предложите это как веб-сервис. SaaS не требует загрузки для клиентов.

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

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

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

Если вы решите, что вам действительно нужно обеспечить принудительную проверку лицензии, запишите его как небольшое расширение C, чтобы код проверки лицензии мог быть очень сложным (но не невозможным!) Для обратного инжиниринга, и оставьте большую часть вашего кода. код на Python.

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

Python не тот инструмент, который вам нужен

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

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

Запутывание действительно трудно

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

Наличие юридических требований - хороший способ пойти

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

Защита кода переоценена

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

133 голосов
/ 08 сентября 2011

Компиляция Python и распространение двоичных файлов!

Разумная идея:

Используйте Cython , Nuitka , Shed Skin или что-то похожее на компиляцию кода Python в C, а затем распространяйте свое приложение в виде двоичных библиотек Python (pyd). .

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

Cython становится все более и более совместимым с CPython, поэтому я думаю, что он должен работать. (На самом деле я рассматриваю это для нашего продукта. Мы уже создаем некоторые сторонние библиотеки в виде pyd / dll, поэтому доставка нашего собственного кода Python в виде двоичных файлов не является для нас слишком большим шагом.)

См. Это сообщение в блоге (не мной) для учебника о том, как это сделать. (спасибо @hithwen)

Сумасшедшая идея:

Вероятно, вы могли бы заставить Cython хранить C-файлы отдельно для каждого модуля, а затем просто объединить их все и создать их с интенсивным встраиванием. Таким образом, ваш модуль Python является довольно монолитным, и на него трудно ориентироваться обычными инструментами.

Безумный:

Вы можете создать один исполняемый файл, если можете статически связывать (и оптимизировать) среду выполнения Python и все библиотеки (dll). Таким образом, было бы трудно перехватывать вызовы в / из python и любых библиотек фреймворка, которые вы используете. Это невозможно сделать, если вы используете код LGPL.

57 голосов
/ 06 ноября 2008

Я понимаю, что вы хотите, чтобы ваши клиенты использовали возможности Python, но не хотите раскрывать исходный код.

Вот мои предложения:

(a) Запишите критические части кода в виде библиотек C или C ++, а затем используйте SIP или swig , чтобы представить API C / C ++ для пространства имен Python.

(b) Используйте cython вместо Python

(c) В обоих случаях (a) и (b) должна быть возможность распространять библиотеки в виде лицензионного двоичного файла с интерфейсом Python.

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

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

[EDIT] Ответ на комментарий Ника:

Ничего не получено и ничего не потеряно. Клиент имеет то, что он хочет (и заплатил за это, так как он сделал изменение самостоятельно). Так как он не выпускает изменения, как будто это не произошло для всех остальных.

Теперь, если клиент продает программное обеспечение, он должен изменить уведомление об авторских правах (что является незаконным, поэтому вы можете подать в суд и выиграете -> простой случай).

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

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

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

30 голосов
/ 08 мая 2015

Вы смотрели на пиминификатор ? Он минимизирует, запутывает и сжимает код Python. Пример кода выглядит довольно неприятно для случайного обратного инжиниринга.

$ pyminifier --nonlatin --replacement-length=50 /tmp/tumult.py
#!/usr/bin/env python3
ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲמּ=ImportError
ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ燱=print
ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ?=False
ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ澨=object
try:
 import demiurgic
except ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲמּ:
 ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ燱("Warning: You're not demiurgic. Actually, I think that's normal.")
try:
 import mystificate
except ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲמּ:
 ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ燱("Warning: Dark voodoo may be unreliable.")
ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲﺬ=ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ?
class ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ?(ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ澨):
 def __init__(self,*args,**kwargs):
  pass
 def ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ클(self,dactyl):
  ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ퐐=demiurgic.palpitation(dactyl)
  ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ?=mystificate.dark_voodoo(ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ퐐)
  return ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ?
 def ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ?(self,whatever):
  ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ燱(whatever)
if __name__=="__main__":
 ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ燱("Forming...")
 ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲﺃ=ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ?("epicaricacy","perseverate")
 ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲﺃ.ﺭ异??ﭞﰣﺁں???뻛??嬭ﱌ???Ꝫﴹ뙫?퉊ﳦﲣפּܟﺶ?ﶨࠔ???????ﶻ?????䉊ﰸﭳᣲ?("Codswallop")
# Created by pyminifier (https://github.com/liftoff/pyminifier)
25 голосов
/ 04 ноября 2008

Не полагайтесь на запутывание. Как вы правильно сделали, он предлагает очень ограниченную защиту. ОБНОВЛЕНИЕ: Вот ссылка на бумагу , которая реверсирует инженерный обфусцированный код Python в Dropbox. Подход - переназначение кода операции - хороший барьер, но, очевидно, его можно победить.

Вместо этого, как упоминалось во многих постерах, сделайте это:

  • Не стоит тратить время на обратное проектирование (Ваше программное обеспечение настолько хорошее, что имеет смысл платить)
  • Заставьте их подписать контракт и проведите аудит лицензии, если это возможно.

В качестве альтернативы, как делает Python IDE WingIDE: Дайте код . Правильно, раздайте код и попросите людей вернуться за обновлениями и поддержкой.

18 голосов
/ 17 февраля 2009

У доставки файлов .pyc есть свои проблемы - они несовместимы с любой другой версией python, отличной от той версии python, с которой они были созданы, что означает, что вы должны знать, какая версия python работает в системах, на которых будет работать продукт. Это очень ограничивающий фактор.

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

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

Таким образом, проверки лицензии могут быть выполнены в безопасности вашей собственной серверной комнаты.

...