Cómo ofuscar código JavaScript

Pega código JavaScript y la herramienta devuelve el mismo programa con los nombres locales cambiados, las cadenas escritas como escapes \xNN y \uNNNN, el acceso con punto convertido en corchetes y los comentarios eliminados. El código sigue ejecutándose con el mismo resultado; todo se procesa en esta pestaña y no se envía nada.

Es ofuscación para dificultar una lectura casual, no cifrado. La lógica sigue dentro, así que no la uses para ocultar claves de API o reglas de negocio, y conserva el original legible: depurar la salida a mano resulta incómodo.

  1. Pega o escribe el script en el área de texto; la versión ofuscada sustituye a la salida anterior. Pulsa Ofuscar JavaScript o Ctrl/⌘+Enter después de cada cambio.
  2. Usa Copiar para llevarte el resultado y Limpiar para vaciar ambos paneles antes del siguiente script.
  3. Antes de publicar la salida, ejecútala contra una muestra pequeña cuyo resultado conozcas; la transformación conserva el comportamiento y la comprobación cuesta un minuto.
  4. Guarda el archivo original. La copia ofuscada es para distribuir; el código legible es el que seguirás editando.

Qué cambia el ofuscador y de qué no puede proteger

Qué cambia el ofuscador

Los comentarios se eliminan, pero los saltos de línea permanecen, así que borrar una nota // nunca se lleva por delante la línea siguiente. Los identificadores declarados dentro del fragmento —variables, funciones, parámetros, clases, capturas de catch— se renombran con nombres cortos generados a través de la cadena de ámbitos; los nombres que vienen de fuera, incluidos los globales, no cambian.

Las cadenas se reescriben carácter a carácter como escapes \xNN o \uNNNN, y la directiva "use strict" se deja tal cual. El acceso con punto pasa a corchetes: console.log se convierte en console["\x6c\x6f\x67"], y el encadenamiento opcional sigue la misma regla (a?.b se convierte en a?.["b"]). Detrás de new e import la sintaxis no se toca, y los campos #privados quedan intactos.

Lo que no es

No es cifrado ni minificación. Las cadenas ofuscadas ocupan más, no menos, y un lector decidido puede seguir la lógica: el objetivo es disuadir el copiado y el vistazo rápido, no hacer imposible la reversión.

Es una sola pasada sobre el código, no un empaquetador: no resuelve importaciones, no transpila sintaxis moderna y no cambia cómo se carga el archivo. Pegar dos veces el mismo script produce salidas distintas, porque los nombres generados dependen del contenido; sirve para distribuir, no para comparar compilaciones.

Comportamiento probado

La salida está probada para devolver los mismos valores que la entrada: clases, funciones flecha, plantillas con expresiones ${} anidadas, async/await, spread, encadenamiento opcional, fusión nula y literales regex pasan las pruebas. El código de módulo conserva sus nombres de import y export, así que sigue cargando como módulo.

Los scripts que usan eval o with no se renombran —omitir el renombrado es la única opción segura allí—, aunque el escapado y la conversión a corchetes sí se aplican. Un archivo de unos 80 KB se procesa en unas decenas de milisegundos; un script ya ofuscado puede ofuscarse otra vez si quieres una segunda pasada.

Herramientas recientes: