node.js - ¿Protección de código?

Quiero usar node.js en mi próximo proyecto, pero a mi jefe no le gusta que nuestros competidores puedan leer el código fuente.

¿Existe alguna forma de proteger el código JavaScript?

preguntado el 10 de mayo de 11 a las 14:05

comprobar jscrambler.com -

Parece ser un buen algoritmo para proyectos de Node.js: enclosejs.com -

14 Respuestas

Puede lograr esto con una NativeExtension para nodo

Tendrías un boostrap.js archivo que agrega un controlador de extensión para archivos .jse

// register extension
require.extensions[".jse"] = function (m) {
 m.exports = MyNativeExtension.decrypt(fs.readFileSync(m.filename));
};

require("YourCode.jse");

YourCode.jse sería la versión cifrada de su código fuente (la clave para el descifrado no estaría en ningún lugar en texto plano porque el proceso de descifrado tiene lugar en la extensión nativa).

Ahora tienes tus NativeExtensions decrypt función transforma la fuente de nuevo a javascript. Solo haz que tu proceso de compilación cree cifrado .jse versiones de todos sus archivos y publíquelos a sus clientes. También necesitarían la extensión nativa, pero ahora ha hecho que sea un poco más difícil modificar su código sin demasiado esfuerzo. Incluso puede hacer que la extensión nativa llame a casa y verifique la información de la licencia para ayudar a prevenir la piratería (tenga en cuenta que esto no detendrá la piratería, no hay solución para eso).

contestado el 02 de mayo de 16 a las 10:05

No hay problema, avíseme cómo va, estoy planeando usar este método en uno de mis proyectos también. Alguien debería desarrollar una biblioteca para este tipo de cosas: Christopher Tarquini

Esto no es seguro. No importa que la clave esté oculta en el módulo binario. Una vez que el cliente descifra y carga su módulo, simplemente puede llamar a console.log (yourmodule.yourmethod.toString ()) e imprimir su código fuente. - dlongley

@ChrisT No siempre se trata de aspectos prácticos ... en general, ejecutar uglify antes de la distribución es suficiente, e incluso con un embellecedor JS, no obtendrá comentarios o los nombres de las variables originales, lo que realmente dificulta la ingeniería inversa de algo. . --- Incluso entonces, cualquiera que pudiera llegar tan lejos, probablemente podría haberlo escrito él mismo. - Tracker1

Envolví la idea de @Chris T en un trabajo repositorio github si alguien está interesado. Sin embargo, tenga en cuenta que esto sigue siendo cerrar la puerta de entrada y dejar la llave debajo de la alfombra exterior; parece que está cerrada, pero en realidad no. - Pawel Sledzikowski

@dlongley ¿No almacenar la fuente de su función dentro de un cierre y devolver un método de acceso público que llama al método privado interno en el cierre evitará que el código real sea accesible simplemente usando toString ()? - Johny José

Solo incluye un contrato de licencia y dales el código fuente. Es posible que quieran personalizarlo de todos modos.

contestado el 10 de mayo de 11 a las 19:05

Para mí, esta es una gran idea, pero para mi jefe, es demasiado peligroso. Si el mundo pudiera ser menos complicado ... - Codificación de furgonetas

Esta es la respuesta correcta, en mi opinión. No existe una forma infalible de evitar que el cliente haga lo que temes. Si está interesado en hacerlo más difícil, puede probar algunas de las soluciones de ofuscación propuestas en este hilo o mirar la función de instantánea de montón de v8. Sin embargo, el acuerdo de licencia es vital. - Me acabo de dar cuenta de que esto es '11 no '12, ¡bueno! Espero que haya funcionado :) - dlongley

Como acabo de completar un gran proyecto puro de Nodejs en más de 80 archivos, tuve el mismo problema que OP. Necesitaba al menos una protección mínima para mi arduo trabajo, pero parece que esta necesidad básica no había sido cubierta por la comunidad del sistema operativo NPMjs. Agregue sal a la lesión: el sistema de cifrado de paquetes JXCore se rompió la semana pasada en unas pocas horas, así que volvamos a la ofuscación ...

Así que creé la solución completa, que maneja la fusión de archivos, la fealdad. Tiene la opción de omitir los archivos / carpetas especificados también de la combinación. A continuación, estos archivos se copian en la nueva ubicación de salida del archivo combinado y las referencias a ellos se reescriben automáticamente.

Enlace NPMjs de node-uglifier

Repositorio de Github de node-uglifier

PD: Me alegraría que la gente contribuyera a hacerlo aún mejor. Esta es una guerra entre ladrones y programadores que trabajan duro como tú. ¡Unamos nuestras fuerzas, aumentemos el dolor de la ingeniería inversa!

Respondido 07 Jul 14, 12:07

Sé que es una publicación antigua, pero sigo buscando una solución para proteger mi código contra la piratería. ¿No ha encontrado una solución más confiable para este propósito? Tnx - eArmin

¿Es posible mantener pocas palabras clave como están sin ofuscación? - Mahesh

Para ser muy claro, el Javascript del lado del cliente (como se descarga desde un servidor remoto en un navegador web estándar) no puede protegerse contra la visualización y / o modificación, sin importar cómo lo oculte desde la reconstrucción ("desofuscación") de la fuente original. es técnicamente trivial. (La ofuscación de JavaScript es simplemente otro ejemplo del nombre inapropiado de seguridad ampliamente utilizado "seguridad a través de la oscuridad").

Si desea utilizar Javascript y Node.js para proporcionar un "producto" protegido (que en este contexto es una aplicación o servicio que requiere instalación en un servidor que su empresa no controla), tampoco puede protegerlo como la única opción disponible para usted (ofuscación) no proporciona tal protección.

Cabe señalar que incluso si su producto se proporciona como un ejecutable binario, eso no es garantía de que pueda proteger la propiedad intelectual que contiene, ya que cualquier binario puede descompilarse en un formato comprensible. En este caso, disfrutamos de cierto nivel de seguridad basado en los recursos excesivos (tiempo / experiencia) necesarios para convertir el código de máquina de bajo nivel (proporcionado por la descompilación) en las construcciones lógicas de nivel superior utilizadas por los lenguajes de programación modernos. (Esto de alguien que una vez descompilló CP / M en una comprensión de su diseño interno a mano.;)

Sin embargo, no todo está perdido: si asumimos que se puede proteger la propiedad intelectual mediante programación (el jurado aún está deliberando sobre esto), hay una manera de proporcionar un producto basado en Node.js de manera segura, pero no es para lo técnicamente poco aventurero, ya que requeriría una refactorización sustancial del código fuente de Node.js (para agregar soporte para bibliotecas criptográficamente seguras y eliminar, o proteger de otro modo, el reflejo de objetos para sus bibliotecas propietarias).

contestado el 10 de mayo de 11 a las 22:05

Si bien esto es cierto, debe decirse que si puede aplicar ingeniería inversa a un producto escrito con, por ejemplo, coffeescript usando requirejs, y luego compilarlo en un solo js, ​​luego ejecute el cierre ... desde ese cifrado a una extensión personalizada, con el exponiendo el módulo cargándolo a través de un stub ... probablemente no lo hiciste NECESIDAD realizar ingeniería inversa para replicar cualquier funcionalidad dada. - Tracker1

El código javascript del lado del servidor es de código completamente cerrado. Nadie puede leerlo.

El código javascript del lado del cliente es completamente de código abierto. Todos pueden leerlo.

Para este último, no puede hacer nada, pero lo mismo se aplica a RoR, ASP.NET, PHP, etc.

El código del servidor real está cerrado a menos que lo ponga a disposición públicamente.

Si está creando una biblioteca y tratando de venderla como una fuente de terceros, entonces está abierta y puede ser robada. Por supuesto, puede demandarlos por incumplimiento de los derechos de autor.

Hay varias grandes empresas como extjs que venden bibliotecas que podrían ser robadas, por eso lo que realmente te venden es el código y un servicio de soporte.

La mayoría de los proyectos comerciales que se basan en nodos son servicios.

contestado el 10 de mayo de 11 a las 18:05

Queremos usarlo en un producto. Cuando un competidor instala este producto, verá el código fuente. - Codificación de furgonetas

Es por eso que todos los proyectos comerciales de node.js son servicios y no productos. Puede ofuscar su fuente con UglifyJS. - James

@FlashFan para crear una biblioteca y venderla. Es de código abierto. - Raynos

será un servicio con interfaz web. La interfaz web será en tiempo real, por lo que node.js sería muy adecuado. Pero sí, será un producto comercial. No puedo cambiar esto;) - Codificación de furgonetas

@FlashFan si violan su derechos de autor, o si usan tu código sin permiso entonces tú puedes demandar ellos. Bienvenidos a la piratería. - Raynos

JXcore (node.js 0.11.X distro) tiene su propia función de empaquetado JX que asegura el código fuente y los activos. Incluso puede seleccionar si ese paquete en particular se puede utilizar desde otras aplicaciones o no. (biblioteca OR independiente)

Digamos que tiene muchos archivos JS, etc. y el punto de entrada a su módulo es algo así como;

exports.doThis = function() { ...... };

si simplemente llama al método siguiente y lo compila en el paquete JX, el código fuente estará seguro.

jxcore.utils.hideMethod(exports.doThis);

esto es (método de ocultación) solo se requeriría para el archivo de entrada, ya que todos los demás archivos sub JS no son accesibles desde la aplicación que realiza la llamada.

Necesita JXcore para ejecutar paquetes JX.

Hay más información disponible en JXcore

Respondido el 05 de enero de 17 a las 09:01

Tenga en cuenta: jxcore no protege la fuente (al menos, ya): github.com/jxcore/jxcore/issues/857#event-579583412 - Ashwin

Empaquete su lógica central en módulos ... estos módulos se pueden construir y luego ejecutar Cierre de Google. Incluso podrías hacer esto como un Tarea gruñona como parte de su proceso de construcción.

Es una vieja pregunta pero vale la pena señalarla. Nota: nada de lo que haga ocultará realmente su código, pero tampoco se enviará nada a través de .Net (C #) o Java. En general, el simple hecho de usar una herramienta como uglify o el cierre debería ser un punto de confusión suficiente. Al ser modular y usar el cierre, en realidad puede hacer muchas optimizaciones que de otro modo serían difíciles.

Respondido el 01 de enero de 13 a las 00:01

Puedes usar EncloseJS - compilador para proyectos de node.js. Realmente compila JavaScript en código nativo y sus fuentes no se incluyen en binario.

Respondido 16 Feb 15, 20:02

La licencia de EncloseJS no permite el uso comercial. - aleung

La primera característica del sitio web: "Haga una versión comercial de su aplicación sin fuentes". Además, es un producto de pago / suscripción, por lo que parece que su intención es un uso comercial. - Cacahuetes

Estimados usuarios de EncloseJS. Te animo encarecidamente a que cambies a github.com/zeit/pkg. Este es un sucesor reescrito de EncloseJS. Es de código abierto y todas las mejoras irán allí: Mladen Oršolić

PKG no parece ocultar nada, puede abrir el binario en VIM y ver todo el código fuente. solo mi experiencia. - Jason

@Jason Esto se resuelve aquí: github.com/vercel/pkg/issues/190. Tldr: Cualquier posibilidad que haya "license": "ISC" en package.json? Elimínelo para deshacerse de las fuentes. - Markus Pscheidt

puedes usar envasador para nodejs para ofuscar su script ...

contestado el 10 de mayo de 11 a las 19:05

¿Tiene alguna información sobre la seguridad del código "empaquetado"? - Codificación de furgonetas

Packer está en desuso. obfuscator.io es una buena alternativa de código abierto y más segura. - Erfan Azhdari

No hay forma de que pueda estar absolutamente seguro de que nadie podrá leer su código. Sin embargo, puede usar la ofuscación o la minificación, lo que puede dificultar significativamente la decodificación de su código. Un ejemplo de ofuscador / minificador es el de Google Compilador de cierre para JavaScript.

contestado el 10 de mayo de 11 a las 18:05

"significativamente más duro" quiere decir "insignificantemente más duro". La ofuscación apenas te ayuda. - Raynos

Raynos: Y además de eso, te dificulta depurar más tarde. - John

Mapas fuente de @John;) - James

Alguien intentó nexe or paquete ?

Parece una buena opción. Una utilidad de línea de comandos que compila su aplicación Node.js en un solo archivo ejecutable.

respondido 17 mar '18, 08:03

nexe y pkg no agregan ninguna protección de código. el código está escrito en javascript claro en el binario que producen - Félix Brunet

Consulta este artículo.

Le mostraré cómo compilar "verdaderamente" el código Node.js (JavaScript) en Bytecode V8. Esto le permite ocultar o proteger su código fuente de una mejor manera que la ofuscación u otros trucos no muy eficientes (como encriptar su código usando una clave secreta, que estará incrustada en los binarios de su aplicación, por eso dije "de verdad" encima).

Entonces, usando la herramienta bytenode, puede distribuir una versión binaria .jsc de sus archivos JavaScript. También puede agrupar todos sus archivos .js usando Browserify y luego compilar ese único archivo en .jsc.

Consulta repositorio de bytes en Github.

Respondido 18 ago 20, 10:08

Paquete viene muy bien.

Para asegurarse de que las fuentes no estén incluidas en el archivo de salida generado, verifique que package.json no especifica un license (Tales como "license": "ISC") que obligaría a incluir fuentes. Ver https://github.com/vercel/pkg/issues/190 para más detalles.

Respondido 13 Feb 21, 19:02

Tengo una idea. Proteger un cpp or java aplicación en lugar de js.

  1. Envuelva su código en un formato de cifrado y compílelo como utf-8 recurso de archivo.
  2. Use su cpp or java aplicación para cargar el archivo completo en una linux pc or arm computer, asegúrese de tener una contraseña segura o cierre ssh port o deshabilite el puerto de video y navegue por la PC con Linux solo por la web.
  3. Hay un programa cpp para descifrar el archivo en la pc linux.
  4. Desarrolle un servidor web para controlar su pc linux.

Así que esto es muy parecido a una caja negra, los clientes no pueden hacer nada con su código.

contestado el 26 de mayo de 16 a las 06:05

No es seguro en absoluto. Las aplicaciones C ++ se pueden realizar fácilmente mediante ingeniería inversa usando IDA Pro (con el complemento hex rays) o Ghidra o Cutter y las aplicaciones Java se pueden realizar mediante ingeniería inversa usando JDAX o JD-GUI - Erfan Azhdari

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.