¿Cómo puedo ofuscar (proteger) JavaScript? [cerrado]

714

Quiero crear una aplicación de JavaScript que no sea de código abierto y, por lo tanto, deseo aprender a ofuscar mi código JS. es posible?

Teifion
fuente
15
Me interesaría saber la razón por la que está tratando de ofuscar el código, ya que podría proporcionar el contexto necesario para dar una respuesta útil.
JohnFx
45
La única forma de mantener realmente algo secreto es no enviárselo al cliente . Si no lo tienen, no pueden leerlo. Enviarlo encriptado es solo pedirle problemas a las pocas personas que realmente se preocupan, y todos los demás no buscarán, incluso si lo envía de forma clara (cf DRM).
Donal Fellows
8
Ofuscar su código no es una buena idea. Solo incomodará a los usuarios legítimos (por ejemplo, cuando necesiten corregir un error), y no hará nada para 'protegerlo' de las personas que tienen un incentivo (financiero) para realizar ingeniería inversa. Es fundamentalmente imposible evitar la ingeniería inversa del código Javascript.
Sven Slootweg
14
El argumento de no ofuscar me parece erróneo. A menos que realmente piense que sus usuarios pueden corregir / informar errores, entonces debe hacerlo. Puede disminuir los tiempos de carga al minificar. Nunca detendrá a un pirata informático realmente dedicado, pero lo ralentizará y detendrá los intentos de piratería a medias. Es muy fácil de hacer y hay muchas herramientas (ver otras respuestas), diría que ciertamente lo hace, ya que solo hay ventajas la mayor parte del tiempo, pero no espere que traiga seguridad real o que evite que alguien copie su código si realmente quieren La única forma de hacerlo es mantener el código del lado del servidor y usar ajax.
Benjamin

Respuestas:

405

Ofuscación:

Prueba el compresor YUI . Es una herramienta muy popular, creada, mejorada y mantenida por el equipo de IU de Yahoo.

También puedes usar:

ACTUALIZACIÓN: Esta pregunta se hizo originalmente hace más de 10 años, y YUI ya no se mantiene. Google Closure Compiler todavía está en uso, y UglifyJS se puede ejecutar localmente a través del administrador de paquetes de nodos:npm install -g uglify-js

Datos de cadena privada:

Mantener los valores de cadena privados es una preocupación diferente, y la ofuscación realmente no será de gran beneficio. Por supuesto, al empaquetar su fuente en un desastre confuso y minificado, tiene una versión ligera de seguridad a través de la oscuridad . La mayoría de las veces, es su usuario quien está viendo la fuente, y los valores de cadena en el cliente están destinados a su uso, por lo que ese tipo de valor de cadena privada a menudo no es necesario.

Si realmente tuvieras un valor que nunca quisiste que un usuario viera, tendrías un par de opciones. Primero, podría hacer algún tipo de cifrado, que se descifra al cargar la página. Esa sería probablemente una de las opciones más seguras, pero también una gran cantidad de trabajo que puede ser innecesario. Probablemente podría codificar en base64 algunos valores de cadena, y eso sería más fácil ... pero alguien que realmente quisiera esos valores de cadena podría decodificarlos fácilmente . El cifrado es la única forma de evitar que alguien acceda a sus datos, y la mayoría de las personas consideran que es más seguridad de la que necesitan.

Nota al margen:

Se sabe que la ofuscación en Javascript causa algunos errores. Los ofuscadores están mejorando un poco al respecto, pero muchos equipos deciden que ven suficientes beneficios al minificar y desglosar , y los ahorros adicionales de la ofuscación no siempre valen la pena . Si está tratando de proteger su fuente, tal vez decida que vale la pena, solo para hacer que su código sea más difícil de leer. JSMin es una buena alternativa.

keparo
fuente
32
Quiero agregar que hacer una codificación base64 no será beneficioso para la seguridad, ya que es un procedimiento trivialmente reversible. Incluso cifrarlo no ayudará si se descifra del lado del cliente. La única forma de garantizar la seguridad de una cadena es hacer que el cliente SOLO vea la cadena encriptada y se la pase a
Claudiu el
16
El servidor para su posterior procesamiento.
Claudiu
99
Para su información, el compresor YUI en línea se puede encontrar aquí: refresh-sf.com/yui
mtness
77
Cifrar los valores de cadena será solo marginalmente más beneficioso que codificarlos en base64, si tienen que ser descifrados por el navegador para usarlos. La razón es que también tendrá que darle al navegador la clave de cifrado, y cualquier cosa que el navegador pueda hacer, el usuario también puede hacerlo.
Ben
99
Cuando hago mi minificación con YUI Compressor, me aseguro de que utiliza métodos de minificación "seguros", es decir, mantiene los puntos y coma --preserve-semi. Reescribir las variables privadas a a, b, c, etc. es generalmente seguro. Otra cosa que hago es hacer que el minificador ponga un salto de línea después de cada punto y coma en el código --line-break 0. Luego, en producción, si se produce un error, al menos tengo una línea de referencia válida para trabajar y puedo encontrar ese código en mi copia de desarrollo. De lo contrario, terminará con un error en una línea de código masiva y sin idea de dónde está el error.
zuallauz
136

Me sorprende que nadie haya mencionado el compilador de cierre de Google . No solo minimiza / comprime, analiza para encontrar y eliminar el código no utilizado, y reescribe para una minificación máxima. También puede hacer verificaciones de tipo y advertirá sobre errores de sintaxis.

JQuery recientemente cambió de YUI Compresser a Closure Compiler, y vio una " mejora sólida "

Jason Hall
fuente
6060
sí, pero recientemente dejaron el compilador de Closure y ahora están usando UglifyJS. El código JQuery tenía errores después de comprimir con el compilador de cierre
Chielus
Me gustaría señalar que, si estás trabajando con angular. esta herramienta realmente no funcionará debido a la inyección de dependencia y el cambio de nombre de los argumentos, a menos que haya una casilla de verificación que no puedo ver.
iConnor
1
Herramienta útil, pero no ofusca, por lo que probablemente nadie más la haya mencionado.
Madbreaks
1
@Madbreaks con optimizaciones avanzadas ( developers.google.com/closure/compiler/docs/api-tutorial3 ) minimizará el código hasta el punto de ofuscación. Las variables pueden ser renombradas por brevedad, por ejemplo.
Jason Hall
Google tampoco es una opción de seguridad
Fillipo Sniper
121

La ofuscación nunca puede funcionar realmente. Para cualquiera que realmente quiera obtener su código, es solo un aumento de velocidad. Peor aún, evita que sus usuarios corrijan errores (y envíen las correcciones a usted), y le dificulta diagnosticar problemas en el campo. Es una pérdida de tiempo y dinero.

Hable con un abogado sobre la ley de propiedad intelectual y cuáles son sus opciones legales. "Código abierto" no significa "la gente puede leer el código fuente". En cambio, Open Source es un modelo de licencia particular que otorga permiso para usar y modificar libremente su código. Si no otorga dicha licencia, las personas que copian su código están en violación y (en la mayoría del mundo) tiene opciones legales para detenerlas.

La única forma en que realmente puede proteger su código es no enviarlo. Mueva el código importante del lado del servidor y haga que su código Javascript público haga llamadas Ajax.

Vea mi respuesta completa sobre ofuscadores aquí.

Schwern
fuente
14
+1 en el Abogado, pero eso podría no funcionar en otros países / jurisdicciones.
jmort253
16
¡Los abogados probablemente crean más costos / problemas que el código perdido, piensan con mucho cuidado y organizan mucho dinero para contratar abogados!
andora
11
-1: Creo que encontrar un abogado que entienda JavaScript sería difícil ... Sin mencionar los honorarios y la cantidad de tiempo necesario para encontrar "infractores". ¿Puede alguien realmente estar violando una licencia que está enterrada en los archivos HTML / JavaScript si nunca firmó nada? +1 para las llamadas AJAX.
Alerty
12
@Alerty 1) Licencias fundamentalmente son sobre la concesión de uso de material con derechos de autor. Tiene poco derecho a usarlo sin la licencia. No tiene que firmarlo para obtener los derechos. Una licencia es diferente de un contrato. 2a) Dado que la pregunta es acerca de que las personas copien y usen HTML / Javascript sin permiso, la licencia no está "enterrada", está ahí en lo que se está tomando. 2b) Tiene poco derecho a utilizar el material protegido por derechos de autor de otra persona sin una licencia. 3) El abogado no necesita entender Javascript, solo la ley de propiedad intelectual.
Schwern
44
@ Alerta No seas obtuso. Se trata de castigar a quienes copian el archivo para usarlo en su propio sitio sin permiso. De lo que estás hablando es de un contrato, no de una licencia. Los contratos requieren consentimiento mutuo y son un toma y daca. Las licencias le otorgan el derecho de usar la propiedad intelectual. Las licencias son unidireccionales (el propietario le está otorgando cosas), no está obligado a firmar porque no está regalando nada. Muchos "Acuerdos de licencia de software" son en realidad contratos porque van más allá de la licencia de la propiedad y en ocasiones a cosas ridículas como el derecho a demandar.
Schwern
49

Puede ofuscar la fuente de JavaScript todo lo que quiera, pero siempre será de ingeniería inversa solo por requerir que todo el código fuente se ejecute realmente en la máquina cliente ... la mejor opción que puedo pensar es tener todo su procesamiento hecho con código del lado del servidor, y todo lo que el código del cliente javascript hace es enviar solicitudes de procesamiento al servidor mismo. De lo contrario, cualquiera siempre podrá realizar un seguimiento de todas las operaciones que realiza el código.

Alguien mencionó base64 para mantener las cadenas seguras. Esta es una idea terrible. Base64 es inmediatamente reconocible por los tipos de personas que desean realizar ingeniería inversa de su código. Lo primero que harán es descifrarlo y ver qué es.

Claudiu
fuente
45
Donde quiera que vaya, la respuesta más común a "¿cómo puedo ofuscar mi Javascript?" es "no deberías preocuparte por eso porque alguien podría desenmascararlo". Esto no es realmente una respuesta.
Travis Wilson
2
@Vivek: un poco tarde, pero lo que realmente quise decir es "código del lado del servidor". Es posible ejecutar JavaScript no en un navegador, solo en un servidor, pero no sé qué tan común es eso.
Claudiu el
8
@Travis: No dije "no deberías preocuparte por eso". Solo dije que si desea un programa de código cerrado, no querrá escribirlo en javascript del lado del cliente, porque cualquier ofuscación que haga no evitará que sea (bastante fácilmente) de ingeniería inversa.
Claudiu
8
Derecha. Lo que de ninguna manera responde "¿cómo puedo ofuscar mi JavaScript". La ofuscación no es un concepto abstracto, es técnico. El operador simplemente preguntó "¿cómo?"
Madbreaks
2
@Madbreaks: la pregunta era en el contexto de no hacer que su código fuera de código abierto. La respuesta técnica inmediata es la aceptada, pero la mejor respuesta en contexto (como, ¿qué estás tratando de hacer realmente?) Es, en mi opinión, que no puedes tener JavaScript del lado del cliente que no sea de código abierto, porque todos tienen la fuente, independientemente de cómo la ofuscas. De cualquier manera, ambas respuestas están aquí y las personas pueden leer y beneficiarse de ambas.
Claudiu
45

Hay varias herramientas de ofuscación de JavaScript que están disponibles gratuitamente; Sin embargo, creo que es importante tener en cuenta que es difícil ofuscar JavaScript hasta el punto en que no se puede realizar ingeniería inversa.

Para ese fin, hay varias opciones que he usado hasta cierto punto en horas extras:

  • Compresor YUI . El compresor JavaScript de Yahoo! Hace un buen trabajo al condensar el código que mejorará su tiempo de carga. Hay un pequeño nivel de ofuscación que funciona relativamente bien. Esencialmente, Compressor cambiará los nombres de las funciones, eliminará los espacios en blanco y modificará las variables locales. Esto es lo que uso con más frecuencia. Esta es una herramienta de código abierto basada en Java.

  • JSMin es una herramienta escrita por Douglas Crockford que busca minimizar su fuente de JavaScript. En las propias palabras de Crockford, "JSMin no ofusca, pero sí lo hace". Su objetivo principal es minimizar el tamaño de su fuente para una carga más rápida en los navegadores.

  • Obfuscator de JavaScript gratuito . Esta es una herramienta basada en la web que intenta ofuscar su código al codificarlo. Creo que las compensaciones de su forma de codificación (u ofuscación) podrían tener el costo del tamaño del archivo; sin embargo, eso es una cuestión de preferencia personal.

Tom
fuente
19
Dado que el código Javascript debe ejecutarse en la máquina del cliente, no solo es difícil ofuscar hasta el punto en que el código no puede ser revertido, sino imposible .
Schwern
20
Se trata de estadísticas. ¿Cuál es el umbral en el que alguien tendrá acceso a su código con ofuscación y sin ella? todavía pueden obtener acceso, pero cuanto más alto es el umbral, menos personas. Cuanta menos gente sepa sobre algo, más seguro será. Práctica estándar de clasificación de seguridad.
Cris Stringfellow
1
La búsqueda / reemplazo de @PeterR en un editor de texto te hará la vida mucho más difícil tratar de leerlo o aplicarle ingeniería inversa. no es perfecto, pero agrega una capa adicional de molestia / dificultad al eliminar pistas de contexto. la mayoría de los programadores no son tan inteligentes como tú, lo que hace que esto sea un gran elemento disuasorio.
SED
1
@SED No conozco a un solo programador que no pueda encontrar / reemplazar un montón de [ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]variables en al menos [var1, var2,..]un minuto. Literalmente puedo des-uglify, volver a sangrar y buscar / reemplazar nombres de var en dos minutos. Y no, soy más inteligente que un Jr. Dev promedio. El hecho simple es que NO hay forma de ocultar JS del lado del cliente. Puedes comprarte 5 minutos, MAX, pero no sirve de nada. Esto es realmente solo para vender a alguien que no conoce el código en "Seguridad" agregada. Nadie que haya escrito una línea de JS compraría esa basura.
Peter R
3
@PeterR "Literalmente puedo des-uglify, volver a sangrar y buscar / reemplazar nombres de variables en dos minutos" - claro, adelante y pruébalo en un paquete de base de código de 20MB minifundido, ofuscado y de múltiples pasadas con una estructura que toma semanas para entender incluso con el código fuente original comentado. Y para hacerlo aún más difícil, existen herramientas de ofuscación que deliberadamente rompen su código si cambian las sangrías, líneas, etc.
John Weisz
23

Que haría yo:

A. Troll el hacker!

Este será en la segunda parte mi LANZADOR de código secreto falso / ofuscado de JavaScript. El que ves en el código fuente.

¿Qué significa este código?

  1. carga el código real
  2. establece un encabezado personalizado
  3. publica una variable personalizada

var ajax=function(a,b,d,c,e,f){
 e=new FormData();
 for(f in d){e.append(f,d[f]);};
 c=new XMLHttpRequest();
 c.open('POST',a);
 c.setRequestHeader("Troll1","lol");
 c.onload=b;
 c.send(e);
};
window.onload=function(){
 ajax('Troll.php',function(){
  (new Function(atob(this.response)))()
 },{'Troll2':'lol'});
}

SI. Ofusca el código un poco

¿Que es eso?

  1. ese es el mismo código que el anterior en base64
  2. este no es el código JavaScript SECRETO

(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()

C Cree un archivo php difícil de mostrar con el código real dentro

¿Qué significa este código php?

  1. Comprueba el referente correcto (dominio / dir / código de su lanzador)
  2. Verificaciones para el HEADER personalizado
  3. Comprueba la variable POST personalizada

Si todo está bien, le mostrará el código correcto; de lo contrario, un código falso o una prohibición de IP, cierre la página ... lo que sea.

<?php
$t1=apache_request_headers();
if(base64_encode($_SERVER['HTTP_REFERER'])=='aHR0cDovL2hlcmUuaXMvbXkvbGF1bmNoZXIuaHRtbA=='&&$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){
 echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';//here is the SECRET javascript code
}else{
 echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';
};
?>

referencia base64 = http://here.is/my/launcher.html

SECRETO javascript = document.body.appendChild(document.createElement('div')).innerText='Awesome';

FALSO = window.open('', '_self', '');window.close();

Ahora ... si define manejadores de eventos en el JavaScript SECRETO, probablemente sea accesible ... debe definirlos afuera con el código de inicio y apuntando a una función SECRETA anidada.

Entonces ... ¿hay una manera fácil de obtener el código? document.body.appendChild(document.createElement('div')).innerText='Awesome';

No estoy seguro de si esto funciona, pero estoy usando Chrome y comprobé Elementos, Recursos, Red, Fuentes, Línea de tiempo, Perfiles, Auditorías, pero no encontré la línea de arriba.

nota1: si abres la URL Troll.php desde Inspeccionar elemento-> red en Chrome, obtienes el código falso.

nota2: todo el código está escrito para navegadores modernos. polyfill necesita mucho más código.

EDITAR

launcher.html

<!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></script></head><body></body></html>

Troll.php

<?php $t1=apache_request_headers();if(/*base64_encode($_SERVER['HTTP_REFERER'])=='PUT THE LAUNCHER REFERER HERE'&&*/$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';}else{echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';}; ?>
coco
fuente
1
ah y sí, también ofuscaría el código javascript.
cocco
1
Esto es algo en lo que estaba pensando, trollear la galleta. Me gustaría ver algo como esto sin tener que usar PHP :)
pgarciacamou
66
Incluso si esto es divertido, un desarrollador web que puede inspeccionar adecuadamente el sitio, de alguna manera puede obtener el código fuente. Realmente creo que no hay forma de ocultar ningún tipo de datos en el momento en que los pone en línea.
cocco
No es ningún tipo de ofuscación, creo. Sin embargo, sabe cómo abrir la consola, también puede saber sobre la codificación / decodificación base64, muy simple.
T.Todua
19

Prueba JScrambler . Le di una vuelta recientemente y me impresionó. Proporciona un conjunto de plantillas para la ofuscación con configuraciones predefinidas para aquellos a quienes no les importan mucho los detalles y solo quieren hacerlo rápidamente. También puede crear ofuscación personalizada eligiendo las transformaciones / técnicas que desee.

Antonio
fuente
77
La suscripción a JScrambler es muy muy cara ... La suscripción más barata requiere un precio mínimo de 3 meses $ 145 - es una locura.
barbushin
1
Ahora tienen un plan gratis. Los otros planes de suscripción siguen siendo tan caros.
user7610
2
El plan gratuito solo incluye optimización y minificación.
Jean Hominal
1
'El plan gratuito incluye optimización y minificación', sí, no. La ofuscación y la optimización no van juntas, lo siento.
NiCk Newman
2
Mirando el sitio web de JScrambler hoy y más planes de precios, no puedo ver una opción gratuita. Solo una prueba gratuita ..
KDT
18

El problema con los idiomas interpretados es que envía la fuente para que funcionen (a menos que tenga un compilador para codificar en bytes, pero de nuevo, es bastante trivial descompilar).

Por lo tanto, si no desea sacrificar el rendimiento, solo puede actuar sobre nombres de variables y funciones, por ejemplo. reemplazándolos con a, b ... aa, ab ... o a101, a102, etc. Y, por supuesto, elimine todo el espacio / líneas nuevas que pueda (eso es lo que hacen los llamados compresores JS).
Las cadenas ofuscadas tendrán un impacto en el rendimiento, si tiene que cifrarlas y descifrarlas en tiempo real. Además, un depurador JS puede mostrar los valores finales ...

PhiLho
fuente
17

Al contrario de la mayoría de las otras respuestas que sugiero contra YUI Compressor; deberías usar Google Closure .

No mucho porque se comprime más, sino sobre todo porque detectará errores de JavaScript como los a = [1,2,3,];que hacen que IE se vuelva loco.

Thomas Bonini
fuente
55
¿No debería comprobar su código contra errores e incompatibilidad de cualquier manera antes de ofuscarse? en realidad no tiene nada que ver con ofuscar
phil294
13

Una aplicación basada en Javascript que no sea de código abierto es bastante tonta. Javascript es un lenguaje interpretado del lado del cliente. La ofuscación no es mucha protección.

La ofuscación de JS generalmente se realiza para reducir el tamaño del script, en lugar de "protegerlo". Si se encuentra en una situación en la que no desea que su código sea público, Javascript no es el idioma correcto.

Hay muchas herramientas disponibles, pero la mayoría tiene la palabra "compresor" (o "minificador") en su nombre por una razón.

dbr
fuente
11

No puede asegurar el código del lado del cliente: simplemente presione F12 en Google Chrome, pause la ejecución de JavaScript y obtendrá todas las cadenas, incluso las encriptadas. Embellecerlo y renombrar variables y obtendrá casi el código original.

Si está escribiendo JavaScript del lado del servidor (es decir, NodeJS) tiene miedo de que alguien piratee su servidor y quiera hacer que el hacker funcione más difícil, dándole más tiempo para recuperar su acceso, luego use compiladores javacript :

Debe usar Closure Compiler en Compilación avanzada, ya que es la única herramienta que cambia el nombre de todas sus variables, incluso si se usan en múltiples archivos / módulos. Pero solo tiene un problema: solo funciona si escribe en su estilo de codificación .

Gustavo Rodrigues
fuente
La compilación de cierre no es un código de ofuscación: P
NiCk Newman
1
No está hecho para eso, pero funciona bien al hacerlo: no agrega código adicional como algunos compiladores (que generalmente se pueden revertir con las herramientas que cité), pero lo cambia a formas poco comunes, algunas incluso difíciles de deshacer, y elimina sin usar código, que en comparación con la ofuscación real es bueno para el rendimiento.
Gustavo Rodrigues
1
No es Buena idea. La minificación / compilación de código del lado del servidor puede presentar problemas de seguridad si el minificador tiene un error: zyan.scripts.mit.edu/blog/backdooring-js
mgol
El error que citó solo se aplica a UglifyJS: no se aplica a Closure Compiler.
Gustavo Rodrigues
Para todos aquellos a quienes les importa minificar archivos javascript, también hay un desminificador de javascript. así que no creo que sea una capa de seguridad en absoluto
Fillipo Sniper
11

Puedo recomendar JavaScript Utility de Patrick J. O'Neil. Puede ofuscar / compactar y comprimir y parece ser bastante bueno en esto. Dicho esto, nunca intenté integrarlo en un script de compilación de ningún tipo.

En cuanto a ofuscar frente a minificar, no soy un gran admirador de lo primero. Hace imposible la depuración (Error en la línea 1 ... "espera, solo hay una línea") y siempre toman tiempo para desempaquetar. Pero si necesitas ... bueno.

Tsvetomir Tsonev
fuente
1
Pero la ofuscación no necesariamente lo comprime en una línea, podría ser tan simple como cambiar la función y los nombres de las variables o convertir cadenas a base64. Minificar pone todo el código en una línea.
rw-nandemo
Hoy en día, UglifyJS parece ser la mejor opción. ¡El autor también es un tipo genial! :)
Tsvetomir Tsonev
Con respecto a la depuración, en su mayoría puede generar mapas de origen que puede incluir al probar para que pueda ver en qué línea se produjo un error, incluso si se minimiza.
Luca Steeb
5

Sugeriría primero minimizar con algo como YUI Compressor, y luego convertir todas las cadenas y números a valores HEX usando algo como http://www.javascriptobfuscator.com/

Con esto, el código se volvería casi imposible de entender y creo que en esta etapa le tomará más tiempo a un Hacker volver a promulgar su código que en realidad si lo reescribiera desde cero. Reescribir y clonar es lo que realmente no puedes detener. ¡Después de todo somos personas libres!

Dynamite Blitzer
fuente
5

Dean Edward's Packer es un excelente ofuscador, aunque principalmente ofusca el código, no ningún elemento de cadena que pueda tener dentro de su código.

Consulte: Herramienta de compresión de Javascript en línea y seleccione Packer (Dean Edwards) del menú desplegable

smdrager
fuente
Carece de sentido. Se puede desempaquetar fácilmente con jsbeautifier.org
Maciej Krawczyk
4

Tengo la impresión de que algunas empresas (por ejemplo: JackBe) ponen código JavaScript cifrado dentro de archivos * .gif, en lugar de archivos JS, como una medida adicional de ofuscación.

xgMz
fuente
4

Pruebe esta herramienta Javascript Obfuscator

Lo usé en mi juego HTML5, no solo reduje su tamaño de 950 KB a 150, sino que también hice que el código fuente de los compiladores de cierre ilegibles y los minificadores sean reversibles. Personalmente, no sé cómo revertir esta ofuscación.

Jerczu
fuente
4

He estado usando Jasob durante años y es el mejor ofuscador que existe.
Tiene una interfaz de usuario avanzada, pero sigue siendo intuitiva y fácil de usar.
También manejará archivos HTML y CSS.

La mejor manera de usarlo es prefijar todas sus variables privadas con algo como un guión bajo, luego use la sortfunción para agruparlas todas y verificar como objetivos para la ofuscación.

Los usuarios todavía pueden ver su fuente, pero es mucho más difícil de descifrar cuando sus variables privadas se convierten de algo parecido _sUserPreferredNickNamea a.

El motor registrará automáticamente el número de variables específicas y las priorizará para obtener la máxima compresión.

No trabajo para Jasob y no obtengo nada de promocionarlos, solo ofrezco algunos consejos amigables.
La desventaja es que no es gratis y es un poco caro, pero aún así vale la pena cuando se compara con las alternativas: las opciones 'gratis' ni siquiera se acercan.

Mate
fuente
Jason parece ser más un minificador que un ofuscador. ¿Me estoy perdiendo de algo?
Alan McBee - MSFT
4

¿Has probado Bananascript ? Produce código altamente comprimido y completamente ilegible.

niutech
fuente
18
comprime el código muy bien, pero solo cambia la eval()última línea console.log()y tu consola
escupirá
4

Estoy usando la utilidad Closure-Compiler para la ofuscación java-script. Minifica el código y tiene más opciones para la ofuscación. Esta utilidad está disponible en el código de Google en la siguiente URL:
Herramientas de cierre

Pero hoy en día escucho mucho de UglifyJS. Puede encontrar varias comparaciones entre Closure Compiler y UglifyJS en las que Uglify parece ser un ganador.
UglifyJS: un nuevo y rápido compresor de JavaScript para Node.js que está a la par con el cierre

Pronto daría la oportunidad a UglifyJS.

shaILU
fuente
3

Como ofuscador / compresor JavaScript / HTML / CSS también puedes probar Patu Digua .

Adrian
fuente
3

Éste minimiza pero no ofusca. Si no desea utilizar la línea de comandos Java, puede pegar su javascript en un formulario web.

Chris S
fuente
1
Nota: El enlace ahora está muerto.
Scott C Wilson
1
@ScottWilson gracias, lo actualizó
Chris S
2

Definitivamente deberías considerar echar un vistazo a Obfuscriptor .

Voy más allá de los típicos trucos de reducción de Javascript que hemos visto en otras herramientas como YUI Compressor o Google Closure .

El código ofuscado se parece más a cifrado. A diferencia de todo lo que he visto antes.

Miguel
fuente
Gracias por el enlace! Acabo de probar el ofuscador y el código encriptado (sin clave ???). ¡Y comprimí mi script de 211 a 36 Kb!
Tenga en cuenta que Obfuscriptor le alerta de que no funciona con IE. Eso es un factor decisivo para algunos.
Alan McBee - MSFT
1
El enlace en la respuesta ya no apunta a la herramienta. No pude encontrar otra referencia en vivo.
buzoherbert 01 de
El primer enlace está muerto. "Obfuscriptor"
Alp Altunel
2

Si usa una biblioteca de JavaScript, considere Dojo Toolkit, que es compatible (después de modificaciones menores) con la compilación de modo avanzado del compilador de cierre.

Dojo: la única biblioteca de JavaScript compatible con The Closure Compiler

El código compilado con el modo Closure Advanced es casi imposible de aplicar ingeniería inversa, incluso pasando por un embellecedor, ya que toda la base del código (incluida la biblioteca) está ofuscada. También es 25% pequeño en promedio.

El código JavaScript que se minimiza (Compresor YUI, Uglify, etc.) es fácil de aplicar ingeniería inversa después de pasar por un embellecedor.

Stephen Chung
fuente