Pregunta ¿Cómo protejo el código de Python?


Estoy desarrollando una pieza de software en Python que se distribuirá a los clientes de mi empleador. Mi empleador quiere limitar el uso del software con un archivo de licencia con restricciones de tiempo.

Si distribuimos los archivos .py o incluso los archivos .pyc, será fácil (descompilar y) eliminar el código que verifica el archivo de licencia.

Otro aspecto es que mi empleador no quiere que nuestros clientes lean el código, por temor a que se lo roben o al menos a las "ideas novedosas".

¿Hay una buena manera de manejar este problema? Preferiblemente con una solución lista para usar.

El software se ejecutará en sistemas Linux (por lo que no creo que py2exe haga el truco).


522
2017-11-04 11:57


origen


Respuestas:


Python, al ser un lenguaje interpretado compilado en código de bytes, es muy difícil de bloquear. Incluso si usa un exe-packager como py2exe, el diseño del ejecutable es bien conocido, y los códigos de byte de Python son bien entendidos.

Por lo general, en casos como este, debe hacer una compensación. ¿Qué tan importante es realmente proteger el código? ¿Hay secretos reales allí (como una clave para el cifrado simétrico de transferencias bancarias), o simplemente estás siendo paranoico? Elija el idioma que le permita desarrollar el mejor producto de la forma más rápida, y sea realista acerca de cuán valiosas son sus ideas novedosas.

Si decide que realmente necesita aplicar la verificación de licencia de forma segura, escríbalo como una pequeña extensión C para que el código de verificación de la licencia sea más difícil (¡pero no imposible!) Para realizar ingeniería inversa y deje la mayor parte del código en Python. .


323
2017-11-04 12:00



"¿Hay una buena manera de manejar este problema?" No. Nada puede protegerse contra ingeniería inversa. Incluso el firmware en las máquinas de DVD ha sido diseñado por ingeniería inversa y Clave de cifrado AACS expuesto. Y eso a pesar de que la DMCA lo convierte en una ofensa criminal.

Como ningún método técnico puede impedir que sus clientes lean su código, debe aplicar métodos comerciales normales.

  1. Licencias Contratos. Términos y Condiciones. Esto aún funciona incluso cuando las personas pueden leer el código. Tenga en cuenta que algunos de sus componentes basados ​​en Python pueden requerir que pague tarifas antes de vender el software utilizando esos componentes. Además, algunas licencias de código abierto le prohíben ocultar la fuente o los orígenes de ese componente.

  2. Ofrezca un valor significativo. Si sus cosas son tan buenas, a un precio que es difícil de rechazar, no hay ningún incentivo para perder tiempo y dinero en la ingeniería inversa. La ingeniería inversa es costosa. Haga que su producto sea un poco menos costoso.

  3. Ofrezca actualizaciones y mejoras que hacen que cualquier ingeniería inversa sea una mala idea. Cuando el próximo lanzamiento rompe su ingeniería inversa, no tiene sentido. Esto puede llevarse a extremos absurdos, pero debe ofrecer nuevas características que hagan que la próxima versión sea más valiosa que la ingeniería inversa.

  4. Ofrezca personalización a precios tan atractivos que prefieran pagarle para que cree y admita las mejoras.

  5. Use una clave de licencia que expira. Esto es cruel y le dará una mala reputación, pero ciertamente hace que su software deje de funcionar.

  6. Ofrecerlo como un servicio web. SaaS no implica descargas a los clientes.


417
2017-11-04 12:29



Python no es la herramienta que necesitas

Debe usar la herramienta correcta para hacer lo correcto, y Python no fue diseñado para ser ofuscado. Es lo contrario; todo está abierto o es fácil de revelar o modificar en Python porque esa es la filosofía del lenguaje.

Si quieres algo que no puedes ver, busca otra herramienta. Esto no es malo, es importante que existan varias herramientas diferentes para diferentes usos.

La ofuscación es realmente dura

Incluso los programas compilados pueden ser de ingeniería inversa, así que no piense que puede proteger completamente cualquier código. Puede analizar PHP ofuscado, romper la clave de cifrado de flash, etc. Las versiones más nuevas de Windows se descifran todo el tiempo.

Tener un requisito legal es una buena forma de hacerlo

No puede evitar que alguien abuse de su código, pero puede descubrir fácilmente si alguien lo hace. Por lo tanto, es solo un problema legal casual.

La protección del código está sobrevalorada

Hoy en día, los modelos comerciales tienden a vender servicios en lugar de productos. No puedes copiar un servicio, piratear ni robarlo. Tal vez es hora de considerar ir con la corriente ...


301
2017-11-04 13:03



¡Compila Python y distribuye binarios!

Idea sensata: 

Utilizar Cython, Nuitka, Mudar la piel o algo similar para compilar python a código C, luego distribuya su aplicación como bibliotecas binarias de python (pyd) en su lugar.

De esa forma, no queda ningún código de Python (byte) y usted ha hecho una cantidad razonable de oscurecimiento que cualquiera (es decir, su empleador) podría esperar del código regular, creo. (.NET o Java son menos seguros que este caso, ya que ese bytecode no está ofuscado y puede descompilarse con relativa facilidad en fuentes razonables).

Cython es cada vez más compatible con CPython, por lo que creo que debería funcionar. (De hecho, estoy considerando esto para nuestro producto. Ya estamos creando algunas librerías de terceros como pyd / dlls, por lo que enviar nuestro propio código python como binarios no es un paso demasiado grande para nosotros).

Ver Esta publicación del blog (no por mí) para un tutorial sobre cómo hacerlo. (thx @hithwen)

Idea loca:

Probablemente puedas conseguir que Cython almacene los archivos C por separado para cada módulo, luego concatenarlos a todos y compilarlos con líneas pesadas. De esta manera, su módulo de Python es bastante monolítico y difícil de fragmentar con herramientas comunes.

Más allá de lo loco:

Es posible que pueda compilar un único ejecutable si puede vincular (y optimizar con) el tiempo de ejecución de python y todas las bibliotecas (dlls) de forma estática. De esta forma, sería difícil interceptar llamadas hacia / desde Python y las bibliotecas de marcos que use. Sin embargo, esto no se puede hacer si estás usando el código LGPL.


121
2017-09-08 11:14



Entiendo que quiere que sus clientes usen el poder de Python pero no quieren exponer el código fuente.

Aquí están mis sugerencias:

(a) Escriba las piezas críticas del código como bibliotecas C o C ++ y luego use sorbo o trago para exponer las API de C / C ++ al espacio de nombres de Python.

(b) Uso cython en lugar de Python

(c) En ambos (a) y (b), debería ser posible distribuir las bibliotecas como binario con licencia con una interfaz de Python.


56
2017-11-06 07:41



¿Sabe tu empleador que puede "robar" cualquier idea que otras personas obtengan de tu código? Quiero decir, si pueden leer tu trabajo, tú también pueden hacerlo. Tal vez mirar cómo puede beneficiarse de la situación arrojaría un mejor rendimiento de su inversión que temer cuánto podría perder.

[EDITAR] Responda al comentario de Nick:

Nada ganado y nada perdido. El cliente tiene lo que quiere (y lo pagó, ya que él mismo hizo el cambio). Como él no lanza el cambio, es como si no hubiera sucedido para todos los demás.

Ahora, si el cliente vende el software, tienen que cambiar el aviso de copyright (que es ilegal, por lo que puede demandar y ganará -> caso simple).

Si no cambian el aviso de copyright, los clientes de segundo nivel notarán que el software proviene de usted original y se preguntan qué está pasando. Lo más probable es que se comuniquen con usted y entonces aprenderá sobre la reventa de su trabajo.

Nuevamente tenemos dos casos: el cliente original vendió solo unas pocas copias. Eso significa que no ganaron mucho dinero de todos modos, entonces ¿para qué molestarse? O se vendieron en volumen. Eso significa mejores oportunidades para que aprenda sobre lo que hacen y hagan algo al respecto.

Pero al final, la mayoría de las empresas intenta cumplir con la ley (una vez que su reputación se arruina, es mucho más difícil hacer negocios). Entonces no te robarán tu trabajo, pero trabajarán contigo para mejorarlo. Entonces, si incluye la fuente (con una licencia que lo protege de la reventa simple), es probable que simplemente rechacen los cambios que hicieron, ya que eso garantizará que el cambio esté en la próxima versión y no tienen que mantenerlo. . Eso es ganar-ganar: obtienes cambios y ellos mismos pueden hacer el cambio si realmente lo necesitan desesperadamente, incluso si no estás dispuesto a incluirlo en el lanzamiento oficial.


32
2017-11-04 12:27



No confíes en la ofuscación. Como ha concluido correctamente, ofrece una protección muy limitada. ACTUALIZAR: Aquí hay un enlace al papel qué código de pitón ofuscado de ingeniería inversa en Dropbox. El enfoque - la reasignación de opcode es una buena barrera, pero claramente puede ser derrotada.

En cambio, como muchos carteles han mencionado, hazlo:

  • No vale la pena el tiempo de ingeniería inversa (Su software es tan bueno, tiene sentido pagar)
  • Haga que firmen un contrato y hagan una auditoría de licencia si es factible.

Alternativamente, como el kick-ass Python IDE WingIDE hace: Regalar el código. Así es, regalar el código y hacer que la gente vuelva para obtener actualizaciones y soporte.


24
2017-11-04 18:53