AfterPack frente a otros ofuscadores de JavaScript

Cómo se compara AfterPack con javascript-obfuscator, js-confuser, JScrambler, JSDefender y ByteHide en tiempo de build, tamaño de salida y si la salida sigue ejecutándose, medido en un mismo arnés.

Todo ofuscador afirma resistir la ingeniería inversa. Lo que importa es qué sigue siendo legible después de que un desofuscador o un modelo de frontera procese la salida, y cuánto cuesta la protección en tiempo de build y en tamaño.

Ejecutamos javascript-obfuscator, js-confuser y ByteHide en nuestro propio arnés junto a AfterPack y publicamos los resultados aquí y en la página principal; consulta Cómo lo medimos. JSDefender y JScrambler no están en la ejecución actual y se describen solo a partir de la documentación del proveedor. Las cifras propias de AfterPack están en Rendimiento.

Qué sobrevive a una pasada de desofuscación

En una prueba pública, un agente de programación devolvió a lógica legible tanto javascript-obfuscator como una herramienta comercial (JScrambler) en unos diez minutos (la ejecución completa en nuestro blog). Las formas de salida fijas lo abaratan: un array de cadenas, incluso cifrado, un intérprete de VM propio o un bootstrap de decodificador que se redefine a sí mismo. webcrack y restringer llevan reconocedores fijos para estas formas y las eliminan en microsegundos; un modelo de frontera hace lo mismo con un prompt en lugar de un parser.

Cada build de AfterPack tiene una forma distinta, así que las herramientas escritas contra los patrones de un build fallan en el siguiente. Quien ejecuta tu código puede seguir leyendo los valores que usa: en el motor 0.2.2, un hook de 15 líneas en tiempo de ejecución recuperó 96 de 97 cadenas plantadas en todos los presets. El modelo de amenaza recoge lo que recupera cada atacante.

Comparación de funciones

Los mismos seis proveedores y siete filas que en la página principal, en el mismo orden.

De dónde salen estas filas

Las tres primeras filas están medidas en nuestro propio arnés de pruebas; consulta Cómo lo medimos más abajo. En el resto, la columna de AfterPack sale de nuestra propia documentación y del producto publicado. Cada una de las demás columnas es lo que publica ese proveedor, y cuando un proveedor no publica nada, la celda lo dice.

FunciónAfterPack (0.2.6)javascript-obfuscator (5.6.0)js-confuser (2.1.3)JSDefenderByteHide (1.0.5)JScrambler
Tiempo de build2.1 s en extreme4.7 s en medium (2.3× más lento)8.8 s en high (4.2× más lento)No ejecutadoNo ejecutado en bundlesNo ejecutado
Tamaño de salida, con gzip10.5× el bundle minificado en extreme (de 8.25× a 11.19×)11.0×12.1× (una única ejecución sin semilla)No ejecutadoNo ejecutado en bundlesNo ejecutado
Preset más fuerte que todavía se ejecutaextreme (preset máximo, 5/5)medium (high se cuelga en CI headless, 0/5)high (preset máximo, 5/5)No ejecutadoPor defecto (todas las opciones activas: 0/5)No ejecutado
Precio y nivel gratuitoGratis, ilimitado en local; de pago desde $49/mesGratis, código abierto; complemento de VM por $19/mesGratis, código abiertoSolo presupuestoSolicitar demoSolo presupuesto
Plugins de frameworks13 plugins oficialesLoaders de la comunidadSolo API de NodeNo se encontró ningunoPlugins, declarados por el proveedorCLI + API
Se ejecuta en el edgeSí: WASM + WorkersNo documentadoNo documentadoNo documentadoNo documentadoNo documentado
Salida compatible con CSP (sin eval, sin new Function)Sí, por defectoNo documentadoNo documentadoNo documentadoNo documentadoNo documentado

Cómo lo medimos

Máquina: un Apple M2 Max, Node 24.21.0. Cada cifra medida de abajo sale de una ejecución del arnés el 16 de octubre de 2026 con el motor 0.2.6 de AfterPack y se puede reproducir con las mismas entradas. Los tiempos de build varían con la carga de la máquina; los tamaños no.

Tiempo de build y tamaño de salida. Cinco bundles de producción reales, ya minificados, ejecutados de principio a fin, tiempo de reloj, mediana por bundle; el tamaño es la salida con gzip sobre la entrada minificada con gzip. AfterPack y js-confuser se ejecutaron en su preset máximo (extreme y high). El preset máximo de javascript-obfuscator, high-obfuscation, activa un antidepurador que se cuelga en ejecución headless o en CI, así que se ejecutó en medium-obfuscation, su preset más fuerte cuya salida todavía termina.

Preset más fuerte que todavía se ejecuta. Cinco programas ejecutables, protegidos y luego ejecutados en CI headless. AfterPack y js-confuser pasan 5/5 en su preset máximo; javascript-obfuscator obtiene 0/5 en high (el antidepurador de arriba) y 5/5 en medium, que es la cifra que recoge la tabla.

Los presets más ligeros de AfterPack sobre los mismos bundles: light, el predeterminado, 1.36× en 0.19 s; medium 7.26× en 0.82 s; hard 8.20× en 1.12 s.

ByteHide. ByteHide no tiene niveles predefinidos, solo opciones, así que se ejecutó dos veces sobre los cinco programas: con su configuración por defecto y con todas las opciones de protección activas. La configuración por defecto mantiene funcionando los cinco programas; con todas las opciones activas, ninguno de los cinco se ejecutó. No se ejecutó sobre los bundles de producción, así que no tiene cifra de tiempo de build ni de tamaño.

JSDefender y JScrambler. Ninguno está en esta ejecución, así que ninguno tiene cifra medida. El plan gratuito de JScrambler solo renombra identificadores y minifica; sus transformaciones de ofuscación requieren un plan de pago. Sus filas de precio, plugins, edge y CSP salen de la documentación pública, y las notas de desofuscación de JScrambler, de un desofuscador público de JScrambler (consulta vs JScrambler).

vs javascript-obfuscator

La opción gratuita y de código abierto a la que recurren primero la mayoría de los equipos, y la herramienta contra la que se escribió webcrack. Su salida es un pipeline fijo: un array de cadenas, un arranque con decodificador de rotación y aplanamiento del flujo de control con una forma de switch reconocible, que antes era una barrera y ahora es una firma.

  • El núcleo está escrito en Rust y se distribuye como binario nativo o WebAssembly, no como biblioteca de JavaScript. En nuestro arnés (cómo lo medimos), AfterPack en extreme protegió un bundle de producción real en una mediana de 2.1 s, frente a los 4.7 s de javascript-obfuscator en medium, con un tamaño con gzip parecido: 10.5× frente a 11.0×.
  • Su salida tiene la misma forma en cada build, y eso es lo que usa webcrack. La forma de AfterPack cambia con cada build.

Ambos son gratuitos; AfterPack añade builds ilimitados y sin tarjeta de crédito.

vs js-confuser

Una alternativa de código abierto más reciente, también gratuita (MIT). En nuestro arnés (cómo lo medimos), los mismos bundles salieron a 12.1× el tamaño minificado en su preset máximo (high), con una mediana de 8.8 s de build, unas cuatro veces la de AfterPack en extreme. Los cinco programas ejecutables siguieron funcionando correctamente en ese preset.

  • js-confuser no documenta ninguna opción de semilla, así que la salida no es determinista entre builds: una misma entrada puede producir bytes distintos en cada ejecución.
  • Hay artículos públicos que documentan cómo recuperar la lógica original de js-confuser; no lo hemos reproducido nosotros.

vs JScrambler

El proveedor comercial establecido, al que se accede tras una llamada comercial y un contrato enterprise. Su nivel básico publica una estructura reconocible por patrones.

La documentación de JScrambler afirma que sus protecciones son polimórficas por defecto y que proteger dos veces la misma entrada no produce la misma salida. Documenta una semilla de aleatorización para reproducir exactamente una protección.

Un desofuscador público y de código abierto para JScrambler reconoce por su estructura las piezas que JScrambler inyecta: el resolvedor del objeto global, el decodificador de cadenas, la máquina de estados del flujo de control y la configuración de alias de nombres. Lee las claves y las constantes de cada archivo. Sus muestras proceden de sitios no relacionados y comparten el mismo preludio inyectado, así que un único reconocedor sirve entre builds y clientes aunque cambien los nombres, las claves y las constantes.

  • Un precio publicado y de autoservicio ($49/mes Indie) en lugar de un contrato que pasa por ventas.
  • El nivel Free supera en capacidad bruta a la mayoría de los niveles comerciales de entrada, sin necesidad de cuenta.
  • Enterprise cubre a los equipos que no pueden enviar código fuente a una API de terceros. La opción sin salida de datos es un build local gratuito.

vs JSDefender

El protector comercial de JavaScript de PreEmptive. El motor y la CLI no están en el npm público: se descargan desde un portal de cuenta con autenticación, y la licencia se comprueba por red en cada ejecución, así que un build no puede ejecutarse sin conexión ni después de que venza la licencia. La licencia es flotante, con un límite de builds simultáneos.

El pipeline es un conjunto fijo de trece transformaciones de código, cada una activable o desactivable. Dos están activadas por defecto: la extracción de literales de cadena a una tabla codificada y el renombrado de variables y funciones declaradas. El resto cubren el aplanamiento del flujo de control, la codificación de literales booleanos y enteros, la indirección de propiedades, la secuenciación de expresiones, la reordenación de funciones y la agrupación de variables. Hay opciones aparte que añaden bloqueos de entorno: una comprobación de integridad autodefensiva, el bloqueo de devtools, la ocultación de la consola, un bloqueo por dominio y un bloqueo por fecha. El runtime de JSDefender se inyecta en el artefacto protegido, y eso es lo que aprovechan los desofuscadores públicos: tres herramientas de código abierto recuperan la lógica original ejecutando el decodificador que se publica junto al código protegido.

La salida no es polimórfica. El pipeline es el mismo en cada build, y una opción randomSeed hace que la salida sea estable byte a byte para una semilla dada, así que un reconocedor escrito contra una versión sigue coincidiendo con la siguiente.

No está en nuestra ejecución actual del arnés, así que esta página no tiene ninguna cifra medida para él.

Un archivo que AfterPack no puede proteger hace fallar el build en lugar de publicarse.

vs ByteHide

Un servicio de protección en la nube. Su CLI y sus plugins de bundler envían cada archivo a los servidores de ByteHide y escriben lo que vuelve, así que su tiempo de build incluye la ida y vuelta por la red.

El motor que hay detrás parece ser javascript-obfuscator: sus nombres de opciones y sus mensajes de validación son los propios de javascript-obfuscator, y con las mismas opciones y la misma semilla su salida coincide con javascript-obfuscator 4.x una vez que se quita el paso adicional de envoltura de números de ByteHide. Tiene las mismas formas fijas: webcrack recuperó un secreto plantado en cada build que hicimos con todos los interruptores de protección activados, y la codificación de cadenas por defecto aplica XOR a cada cadena con un único byte de clave.

En nuestro arnés (cómo lo medimos), su configuración por defecto mantuvo funcionando los cinco programas; con todas las opciones de protección activas, ninguno de los cinco se ejecutó.

  • El nivel gratuito de AfterPack se ejecuta por completo en tu máquina, sin medición, sin cuenta, sin tarjeta y sin llamada de demostración.
  • Enviar código fuente a cualquier paso de build en la nube, ByteHide incluido, es la contrapartida que Enterprise y un build local gratuito existen para evitar.

vs Terser

Terser es una categoría de herramienta distinta: minifica, acorta nombres y pliega bien las expresiones constantes. El código minificado conserva toda la lógica original, así que no ofrece ninguna resistencia a un LLM que lea el resultado. Ejecuta Terser y después AfterPack sobre su salida. AfterPack no sustituye a un minificador: incluso su preset minify, que no aplica ninguna ofuscación, hace más grande un bundle ya minificado.

Qué recupera un atacante estático

HerramientaQué recupera un lector estático
Solo minificadoTodo. Un LLM de frontera explica el código minificado casi tan fácilmente como el código formateado, ya que solo cambiaron los nombres.
javascript-obfuscatorEn la práctica, todo. Una salida de pipeline fijo significa que webcrack la revierte en segundos.
js-confuserHay artículos públicos que documentan cómo recuperar su lógica original; no lo hemos reproducido nosotros.
JScrambler (nivel básico)Una estructura real, pero reconocible por patrones.
JSDefenderEn la práctica, todo. El decodificador se publica en el artefacto, así que una herramienta pública lo ejecuta y vuelve a imprimir la lógica original.
ByteHideEn la práctica, todo. La salida tiene las formas fijas de javascript-obfuscator, así que webcrack la recupera, y la codificación de cadenas por defecto es un XOR de un solo byte.
AfterPack FreeUn programa equivalente con el mismo comportamiento. Los nombres se renombran en todos los presets y las cadenas se codifican desde light; los números siguen legibles en light. Las herramientas de patrones no obtienen nada más que grep, mientras que la evaluación estática todavía recupera la mayoría de las cadenas (medido). El siguiente build tiene otra forma.
AfterPack Pro (regiones marcadas)Un programa equivalente con el mismo comportamiento: las mismas transformaciones que Free, con un preset más pesado en las regiones que marcas.

Las definiciones completas de las clases están en Clases de reversión y en Cómo funciona AfterPack. Verifica tu propio build con el Protection Map.

Alcance de esta comparación

Con tiempo suficiente, la salida de cualquier ofuscador se puede revertir, incluida la de AfterPack. Frente a una herramienta de pipeline fijo, un reconocedor escrito una vez sirve para todos los builds. Frente a AfterPack, las herramientas construidas sobre la forma de un build hay que rehacerlas para el siguiente, mientras que un hook en tiempo de ejecución sirve para todos.

Siguiente

  • Cómo funciona AfterPack: las clases de reversión y la supervivencia de los secretos, explicadas por completo.
  • Niveles: el límite entre Free y Pro y dónde se aplican las transformaciones quirúrgicas de Pro.
  • Modelo de amenaza: la escala de adversarios con respecto a la que se define cada afirmación anterior.
  • Auditoría: escanea cualquier sitio en producción, tuyo o de un competidor, para ver qué filtra ahora mismo.