# Glosario de ofuscación

El vocabulario de la documentación de AfterPack: polimorfismo, no materialización, clases de reversión y el resto, definidos una sola vez.

Source: https://www.afterpack.dev/es/docs/glossary

La documentación de AfterPack usa estos términos con los significados que se definen aquí.

## Los dos ejes

La protección de AfterPack se describe a lo largo de dos ejes independientes: cuánto cuesta revertir *un* build y cuánto difieren los builds *entre sí*. Puedes subir uno sin el otro.

### Complejidad

Cuánto cuesta revertir un único build: la profundidad de la protección dentro de un artefacto. La establece [`complexity`](#complexity), directamente o a partir de un [preset](https://www.afterpack.dev/es/docs/presets#the-ladder).

### Polimorfismo por build

Cuánto difiere cada build del anterior. Lo fija la [semilla](#seed): [`seed`](https://www.afterpack.dev/es/docs/config#seed) en la configuración del motor, [`--seed`](https://www.afterpack.dev/es/docs/config#seed) en la línea de comandos. Es la defensa principal de AfterPack. Cada build tiene una forma distinta, así que las herramientas escritas contra los patrones de un build fallan en el siguiente. Quien ejecuta el código puede seguir leyendo los valores que usa. Consulta [Cómo funciona AfterPack](https://www.afterpack.dev/es/docs/concepts#a-new-program-every-build).

## Configuración

### Preset

Un conjunto con nombre de ajustes de protección, que se selecciona con [un solo flag](https://www.afterpack.dev/es/docs/config#preset): `minify`, `light`, `medium`, `hard`, `extreme`. El valor por defecto es `light`. Un solo nombre de preset establece el objetivo de [`complexity`](#complexity). El objetivo que fija cada peldaño está en [Presets](https://www.afterpack.dev/es/docs/presets#the-ladder).

### complexity

El grado de entrelazado de la salida; consulta [Configuración](https://www.afterpack.dev/es/docs/config#complexity). No tiene límite superior. Un [`inflation.max`](https://www.afterpack.dev/es/docs/config#inflation-max) explícito que lo bloquea hace fallar el build; si no se establece, el objetivo por sí solo decide hasta dónde crece la salida. Los valores de cada preset están en [Presets](https://www.afterpack.dev/es/docs/presets#the-ladder).

### Directivas

Comentarios de [bloque](https://www.afterpack.dev/es/docs/directives#writing-one) en el código fuente que ajustan la protección de la construcción a la que se asocian. Un [`/* @afterpack preset=extreme */`](https://www.afterpack.dev/es/docs/config#preset) en línea cubre el literal que le sigue. Una forma de bloque, `/* @afterpack <key>=<value> */ … /* @afterpack end */`, se abre con el marcador solo en su línea y se cierra con el `end` correspondiente, cubriendo un tramo explícito. Un comentario de línea `//` no se analiza. [`skip`](https://www.afterpack.dev/es/docs/config#skip) reduce la protección donde necesitas compatibilidad; [`preset=hard`](https://www.afterpack.dev/es/docs/config#preset) o [`preset=extreme`](https://www.afterpack.dev/es/docs/config#preset) la aumentan. Solo un motor [Pro](https://www.afterpack.dev/es/docs/pro) respeta una región; consulta [Builds Free](https://www.afterpack.dev/es/docs/directives#free-builds). Una exclusión en Free usa en su lugar [`paths.exclude`](https://www.afterpack.dev/es/docs/config#paths-exclude) o [`identifiers.reserved`](https://www.afterpack.dev/es/docs/config#identifiers-reserved). Consulta [Directivas](https://www.afterpack.dev/es/docs/directives).

### `preset=hard`

Una directiva (`/* @afterpack preset=hard */`) que eleva una [región](https://www.afterpack.dev/es/docs/directives#what-you-can-set) a [`complexity`](#complexity) 12, el [peldaño `hard`](https://www.afterpack.dev/es/docs/presets#the-ladder), y fuerza el [mínimo de cadenas](https://www.afterpack.dev/es/docs/config#strings-encode) en esa región independientemente del preset global. [`/* @afterpack preset=extreme */`](https://www.afterpack.dev/es/docs/config#preset) hace lo mismo con objetivo 25.

## Reversión y el modelo de atacante

### Estructura fija

Una forma que se mantiene igual entre builds: un array de cadenas (incluso cifrado), un intérprete de VM, un bootstrap de decodificador idéntico en cada build. Esa forma es lo que una herramienta como `webcrack`, o un modelo, aprende una vez y reutiliza en cada build que la comparte. Cualquier ofuscador puede variar constantes entre builds; lo que importa es si debajo sigue habiendo una forma así. AfterPack toma sus formas, nombres, constantes y disposición de nuevo de la [semilla](#seed) de cada build, así que un reconocedor escrito contra los patrones de un build falla en el siguiente. No oculta valores a quien ejecuta el código. Consulta [Por qué fallan las capas de ofuscación fijas](https://www.afterpack.dev/es/docs/concepts#why-fixed-obfuscation-layers-fail).

### Clases de reversión

Tres clases de atacante estático que describen con qué se queda quien lee los bytes, grep, las herramientas de AST o un LLM a ciegas que no ejecuta el código: renombrado y codificado, aplanado y fusionado, y destruido y fusionado. Un atacante dinámico que ejecuta el código es un caso aparte y más fuerte. La tabla de clases y lo que cada una le aporta a un atacante están en [Clases de reversión](https://www.afterpack.dev/es/docs/reversal-classes). Hoy solo la primera, renombrado y codificado, la produce alguna transformación publicada; aplanado y fusionado, y destruido y fusionado, quedan reservadas.

### No materialización

El mecanismo que protege un secreto, distinto de las clases de reversión anteriores, que recuperan estructura y no valores. Lo proporciona [`transforms.comparisonHardening.enabled`](https://www.afterpack.dev/es/docs/config#transforms-kind-enabled), que reescribe una comprobación de igualdad de cadenas como una verificación de digest unidireccional, de modo que el literal no está en el artefacto. Esto se diferencia del [mínimo de cadenas](https://www.afterpack.dev/es/docs/config#strings-encode), que codifica un literal pero lo reconstruye al usarlo. Vence a un lector estático y a un LLM a ciegas. No vence a un atacante que ejecuta el código en un runtime instrumentado; ningún ofuscador en tiempo de build cambia eso. Consulta [Cómo sobreviven los secretos](https://www.afterpack.dev/es/docs/concepts#how-secrets-survive).

## Entrega, semilla y niveles

### Semilla

El parámetro de build que selecciona qué salida polimórfica se produce. Aleatoria por defecto. No es un secreto: el artefacto publicado es público de todos modos, y conocer la semilla de un build no ayuda a revertirlo. Varíala en cada versión en producción. Fíjala ([`--seed=git`](https://www.afterpack.dev/es/docs/config#seed)) solo cuando necesites una salida idéntica byte a byte, para la caché de CI o una auditoría reproducible. Consulta [`seed`](https://www.afterpack.dev/es/docs/config#seed) y [Builds y versiones](https://www.afterpack.dev/es/docs/builds).

### Source maps

Correspondencias que enlazan la salida ofuscada con tu código fuente original. Útiles para depurar en local. Un `.map` público le da a un atacante un camino directo a tu código fuente. Nunca publiques uno en producción. AfterPack [desactiva los source maps por defecto](https://www.afterpack.dev/es/docs/config#sourceMap-enabled) en un build de [producción](https://www.afterpack.dev/es/docs/config#build-mode), elimina el [comentario `sourceMappingURL`](https://www.afterpack.dev/es/docs/config#sourceMap-emitUrl) y borra los mapas que escribió tu bundler.

### Protection Map

El informe que colorea cada token de tu código fuente según su puntuación de complejidad y nombra la [clase de reversión](#reversal-classes) de cada región. Lo decide el motor por defecto; lo diriges tú en cuanto [marcas regiones](https://www.afterpack.dev/es/docs/directives) en [Pro](https://www.afterpack.dev/es/docs/pro). Se controla con [`protectionMap.enabled`](https://www.afterpack.dev/es/docs/config#protectionMap-enabled). Consulta [Protection Map](https://www.afterpack.dev/es/docs/protection-map) o abre la [demo en vivo](https://www.afterpack.dev/protection-map-demo).

### Niveles

Free, Extra MB, Indie, Team, Studio, [Enterprise](https://www.afterpack.dev/es/docs/enterprise). Free aplica protección con toda su fuerza de manera uniforme en todo el bundle. Los niveles de pago también pueden fijar un preset más pesado o más ligero en una función o un archivo, con una [directiva](https://www.afterpack.dev/es/docs/directives). Los precios, las asignaciones y los límites de proyectos están en [Planes y niveles](https://www.afterpack.dev/es/docs/tiers).

### Fail-closed

La regla de que un build Pro nunca publica una protección más débil de la que pediste. Si la nube Pro no es accesible tras los reintentos, o la asignación se agota a mitad de un lote, AfterPack se detiene con un código de salida distinto de cero. No recurre a una salida del nivel Free ni a texto sin ofuscar. Consulta [Códigos de salida y fail-closed](https://www.afterpack.dev/es/docs/diagnostics#fail-closed-no-exceptions).

## Siguiente

- [Cómo funciona AfterPack](https://www.afterpack.dev/es/docs/concepts): donde se usan en contexto la mayoría de estos términos.
- [Configuración](https://www.afterpack.dev/es/docs/config): cada opción y qué forma puede establecerla.
- [Directivas](https://www.afterpack.dev/es/docs/directives): la gramática completa de `@afterpack` y qué claves se aplican.
- [Presets](https://www.afterpack.dev/es/docs/presets): la escala de la que vienen los valores objetivo anteriores.
- [Diagnósticos](https://www.afterpack.dev/es/docs/diagnostics): los códigos `DIAG_*` en los que aparecen estos términos.
