Как защитить и скомпилировать исходный код Python в библиотеку .so?

Я хотел бы защитить свой исходный код Python, я знаю, что абсолютная защита невозможна, но все же должны быть какие-то средства, чтобы сделать это достаточно сложным или трудоемким. я хочу

1) для автоматического удаления всей документации, комментариев и

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

Возможно, лучшим решением, которое сделало бы 1) и 2) излишними, является следующее:

3) Существует ли простой способ компиляции модулей Python в библиотеки .so с понятным интерфейсом, который может использоваться другими модулями Python? ? Это было бы похоже на создание расширений C и C++ с помощью distutils, за исключением того, что исходным кодом является сам python, а не C/C++. Идея состоит в том, чтобы организовать весь «секретный код» в модули, скомпилировать их, а затем импортировать в остальной код Python, который не считается секретным.

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


person Mannaggia    schedule 11.07.2012    source источник
comment
Есть Cython, который может делать то, что вы хотите для номера 3, однако я полагаю, что вам нужно будет поддерживать .so для каждой системы и каждой версии Python, что может стать довольно утомительным... Я не уверен, насколько это будет спрятаться от способностей самоанализа питона.   -  person mgilson    schedule 11.07.2012
comment
Можно ли повторно использовать весь код Python, который импортирует библиотеки С++ .so и использует также numpy, и скомпилировать его с помощью Cython (без добавления типов или изменения исходного кода)?   -  person Mannaggia    schedule 11.07.2012
comment
Я мало использовал Cython, поэтому не могу сказать. Я подозреваю, что да, но я действительно не знаю. Может быть, кто-то еще может взвесить это?   -  person mgilson    schedule 11.07.2012


Ответы (1)


Как упомянул Мгилсон в комментариях, Cython, вероятно, ваш лучший выбор. Вообще говоря, вы можете использовать его для преобразования исходного кода на чистом Python в скомпилированные модули расширения. Хотя основная цель Cython — повысить производительность, не должно быть никаких препятствий для его использования для защиты исходного кода. Модули расширения, которые он выводит, не ограничены какими-либо особыми способами, поэтому все, что вы могли делать из Python раньше, вы сможете делать из модулей расширения, сгенерированных Cython. У Cython есть несколько известных ограничений с точки зрения поддерживаемых функций, которые, возможно, придется обойти, но в целом он выглядит хорошо подходящим для ваших целей.

person Rakis    schedule 11.07.2012
comment
@Mannaggia - Руководство по Cython выглядит пугающе, но на самом деле его довольно легко читать. Более того, вы должны иметь возможность просмотреть большую часть этого, поскольку вы не будете использовать какие-либо функции C-интеграции. - person Rakis; 14.07.2012
comment
спасибо, кажется, работает для одного модуля, но я понял, что модуль, который я компилирую, по-прежнему импортирует другие исходные модули Python, есть способ создавать библиотеки .so в cython путем систематической компиляции всех модулей в пакете и убедиться, что каждый модуль импортирует только библиотеки .so, а не исходный python? - person Mannaggia; 16.07.2012
comment
Я не знаю ни одного автоматизированного метода. Но, вероятно, было бы довольно легко запустить скрипт, который преобразует все интересующие вас файлы .py в эквивалентные файлы .pyx, а затем запустить транслятор cython, чтобы преобразовать их все в файлы .c. - person Rakis; 16.07.2012
comment
да, это рассматривается здесь но не так просто сохранить все пакеты/пространства имен при компиляции, к счастью, кто-то сделал для этого скрипт - person Mannaggia; 29.07.2012
comment
@Mannaggia Попробуйте Nuitka, он может рекурсивно преобразовать ваши py-модули в исходные файлы C++ и скомпилировать их в один файл so (или автономный исполняемый файл, если хотите). - person Meow; 25.01.2015
comment
@Mannaggia Пожалуйста, взгляните на мой связанный вопрос stackoverflow.com/questions/50459248/ - person user13107; 22.05.2018