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?
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?
Respuestas:
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.
--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.
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 "
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.
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.
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.
[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.
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?
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?
(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?
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=';}; ?>
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.
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 ...
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.
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.
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 .
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.
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!
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
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.
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 sort
funció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 _sUserPreferredNickName
a 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.
¿Has probado Bananascript ? Produce código altamente comprimido y completamente ilegible.
eval()
última línea console.log()
y tu consola
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.
Como ofuscador / compresor JavaScript / HTML / CSS también puedes probar Patu Digua .
Éste minimiza pero no ofusca. Si no desea utilizar la línea de comandos Java, puede pegar su javascript en un formulario web.
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.
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.
Lo he usado en el pasado y hace un buen trabajo. No es gratis, pero definitivamente deberías echar un vistazo.
JavaScript Obfuscator & Encoder