¿Cómo protejo el código Python para que no sea leído por los usuarios?
Estoy desarrollando un 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 restricción de tiempo.
Si distribuimos los .py
archivos o incluso .pyc
archivos 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 le roben el código o al menos las "ideas novedosas".
¿Existe una buena manera de manejar este problema?
"¿Existe una buena manera de solucionar este problema?" No. Nada puede protegerse contra la ingeniería inversa. Incluso el firmware de las máquinas de DVD ha sido sometido a ingeniería inversa y la clave de cifrado AACS ha quedado expuesta. Y eso a pesar de que la DMCA lo tipifica como delito penal.
Dado que ningún método técnico puede impedir que sus clientes lean su código, debe aplicar métodos comerciales habituales.
Licencias. Contratos. Términos y condiciones. Esto todavía 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 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.
Ofrezca un valor significativo. Si sus productos son tan buenos, a un precio difícil de rechazar, no hay ningún incentivo para perder tiempo y dinero realizando ingeniería inversa en nada. La ingeniería inversa es cara. Haga que su producto sea un poco menos costoso.
Ofrezca actualizaciones y mejoras que hagan que cualquier ingeniería inversa sea una mala idea. Cuando la próxima versión rompa su ingeniería inversa, no tendrá sentido. Esto puede llevarse a extremos absurdos, pero se deben ofrecer nuevas funciones que hagan que la próxima versión sea más valiosa que la ingeniería inversa.
Ofrezca personalización a precios tan atractivos que preferirán pagarle a usted para crear y respaldar las mejoras.
Utilice una clave de licencia que caduque. Esto es cruel y le dará mala reputación, pero ciertamente hace que su software deje de funcionar.
Ofrécelo como un servicio web. SaaS no implica descargas para los clientes.
Python, al ser un lenguaje interpretado compilado mediante código de bytes, es muy difícil de bloquear. Incluso si utiliza un empaquetador exe como py2exe , el diseño del ejecutable es bien conocido y los códigos de bytes de Python se comprenden bien.
Por lo general, en casos como este, hay que hacer una compensación. ¿Qué importancia tiene realmente proteger el código? ¿Hay verdaderos secretos ahí (como una clave para el cifrado simétrico de transferencias bancarias) o simplemente estás siendo paranoico? Elija el lenguaje que le permita desarrollar el mejor producto más rápidamente y sea realista acerca del valor de sus ideas novedosas.
Si decide que realmente necesita aplicar la verificación de licencia de forma segura, escríbala como una pequeña extensión de C para que el código de verificación de licencia pueda ser muy difícil (¡pero no imposible!) de realizar ingeniería inversa y deje la mayor parte de su código en Python. .
Python no es la herramienta que necesitas
Debe utilizar la herramienta adecuada para hacer lo correcto, y Python no fue diseñado para ofuscarse. Es todo lo contrario; todo es abierto o 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 difícil.
Incluso los programas compilados pueden sufrir ingeniería inversa, así que no crea que puede proteger completamente ningún código. Puede analizar PHP ofuscado, romper la clave de cifrado flash, etc. Las versiones más nuevas de Windows se descifran cada vez.
Tener un requisito legal es un buen camino a seguir
No puedes evitar que alguien haga un mal uso de tu código, pero puedes descubrirlo fácilmente si alguien lo hace. Por lo tanto, es sólo una cuestión legal casual.
La protección del código está sobrevalorada
Hoy en día, los modelos de negocio tienden a centrarse en la venta de servicios en lugar de productos. No se puede copiar un servicio, piratearlo ni robarlo. Tal vez sea hora de considerar dejarse llevar por la corriente...
¡Compila Python y distribuye binarios!
Idea sensata:
Utilice Cython , Nuitka , Shed Skin o algo similar para compilar Python en código C y luego distribuya su aplicación como bibliotecas binarias de Python (pyd).
De esa manera, no quedará ningún código Python (byte) y creo que habrá realizado una cantidad razonable de oscurecimiento que cualquiera (es decir, su empleador) podría esperar del código normal. (.NET o Java son menos seguros que este caso, ya que ese código de bytes no está ofuscado y puede descompilarse con relativa facilidad en una fuente razonable).
Cython es cada vez más compatible con CPython, así que creo que debería funcionar. (De hecho, estoy considerando esto para nuestro producto. Ya estamos creando algunas bibliotecas de terceros como pyd/dlls, por lo que enviar nuestro propio código Python como binarios no es un paso demasiado grande para nosotros).
Consulte esta publicación de blog (no escrita por mí) para obtener un tutorial sobre cómo hacerlo. (gracias @hithwen)
Idea loca:
Probablemente podría hacer que Cython almacene los archivos C por separado para cada módulo, luego simplemente concatenarlos todos y compilarlos con una gran cantidad de líneas integradas. De esa manera, su módulo Python es bastante monolítico y difícil de modificar con herramientas comunes.
Más allá de lo loco:
Es posible que pueda crear un único ejecutable si puede vincular (y optimizar con) el tiempo de ejecución de Python y todas las bibliotecas (dll) estáticamente. De esa manera, seguramente será difícil interceptar llamadas hacia/desde Python y cualquier biblioteca de marco que utilice. Sin embargo, esto no se puede hacer si estás usando código LGPL.
Entiendo que desea que sus clientes utilicen el poder de Python pero no desea 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 SIP o swig para exponer las API de C/C++ al espacio de nombres de Python.
(b) Utilice cython en lugar de Python
(c) Tanto en (a) como en (b), debería ser posible distribuir las bibliotecas como binarios con licencia con una interfaz Python.