Documentación
/

Clave de codificación del array de bytecode

Externalizar la clave de cifrado del array de bytecode

Pro

Proporcione su propia clave de cifrado del bytecode de la VM con vmBytecodeArrayEncodingKey y devuélvala en tiempo de ejecución mediante un getter de clave - mantenida fuera del bundle, leída desde el almacenamiento del cliente o recuperada desde su backend.

Qué hacen estas opciones

vmBytecodeArrayEncoding cifra el array de bytecode de la VM para que no aparezca como texto plano en la salida. De forma predeterminada, la clave de cifrado se deriva del entorno y se reconstruye en el cliente, por lo que usted nunca la manipula. Esto es cómodo, pero el material de la clave sigue residiendo en el bundle.

Dos opciones le permiten sacar la clave del bundle y controlarla usted mismo:

  • vmBytecodeArrayEncodingKey - la clave que usted proporciona en tiempo de compilación. Cuando se define, se utiliza en lugar de la clave predeterminada derivada del entorno, y no se incrusta en la salida ofuscada.
  • vmBytecodeArrayEncodingKeyGetter - una expresión de JavaScript que devuelve esa misma clave en tiempo de ejecución. Se incrusta literalmente y se evalúa en el navegador cuando se carga el código ofuscado.

La clave está en la separación: como la clave no está en el código, un análisis puramente estático del bundle no puede recuperarla. Aun así debe estar presente en tiempo de ejecución para que el código funcione, por lo que no es verdaderamente secreta - pero usted decide de dónde proviene y quién puede verla.

Estas dos opciones forman un par. vmBytecodeArrayEncodingKey sin un getter deja al código ofuscado sin forma de obtener la clave en tiempo de ejecución, y un getter sin una clave de compilación correspondiente no tiene nada con lo que concordar. Defina ambas, junto con vmBytecodeArrayEncoding: true.

Cómo se combinan las dos claves

Su clave nunca se utiliza por sí sola - en ambos lados se mezcla con una clave interna que controla el ofuscador:

  • Tiempo de compilación. vmBytecodeArrayEncodingKey se combina con una clave interna que deriva el ofuscador, y el array de bytecode se codifica con la clave mixta resultante.
  • Tiempo de ejecución. El valor al que se resuelve su vmBytecodeArrayEncodingKeyGetter se combina con la misma clave interna, reconstruida en el cliente a partir de diversos factores de ejecución, para decodificar el bytecode.

Como ambos lados mezclan su clave con la clave interna, el getter debe resolverse a exactamente la misma cadena que pasó como vmBytecodeArrayEncodingKey. Ninguna de las dos partes basta por sí sola: su clave sin la clave interna no puede decodificar el bytecode, y la clave interna es inútil sin la suya - por eso controlar quién recibe su clave es lo que realmente protege el código.

Proporcionar la clave en tiempo de ejecución

De forma predeterminada, el getter es síncrono: la expresión debe devolver la clave de inmediato cuando se carga el código ofuscado. Léala desde cualquier fuente que ya esté presente en el cliente - una cookie, localStorage, una variable global o un elemento del DOM inyectado por el servidor.

JavaScript

La clave debe existir antes de que se ejecute el código ofuscado:

JavaScript

Otras fuentes síncronas funcionan de la misma manera - elija la que su aplicación ya rellene:

JavaScript

Mantenga la clave fuera del mismo archivo o script que el código ofuscado. Incrustarla ahí en línea arruina todo el propósito - un análisis estático del bundle recuperaría tanto el código como su clave. Almacénela en una fuente separada e inyecte la vmBytecodeArrayEncodingKey de compilación desde una variable de entorno o un secreto en lugar de incluirla en un commit.

Recuperar la clave desde su backend (async)

Requiere vmAsyncExecutor · v7.3.0+

Un getter síncrono solo puede leer lo que ya está en el cliente. Para recuperar la clave desde su servidor - de modo que pueda protegerla tras una autenticación y revocarla -, el getter debe ser asíncrono, y eso requiere vmAsyncExecutor. Con el ejecutor asíncrono habilitado, el getter puede devolver una Promise, y la VM la espera antes de ejecutarse.

JavaScript

Un getter que devuelve una Promise requiere vmAsyncExecutor. Esto no se puede comprobar en tiempo de compilación, por lo que un getter que devuelve una Promise con vmAsyncExecutor desactivado falla en tiempo de ejecución - el decodificador recibe el objeto Promise en lugar de la cadena de la clave.

Autoriza la entrega de claves mediante una sesión validada y las comprobaciones de licencia necesarias. Origin o Referer por sí solos no autentican al cliente; las peticiones GET del mismo origen pueden omitir Origin. Desactiva la caché. Vincula las claves a la versión correcta y despliega claves y bundles juntos. Un cliente que recibe la clave puede inspeccionarla en ejecución.

JavaScript

Cuando la clave no coincide

El código ofuscado solo funciona cuando el getter devuelve exactamente la misma clave utilizada durante la ofuscación. Si las claves difieren - o si el getter devuelve undefined, null o una cadena vacía -, el descifrado produce un flujo de claves incorrecto y el código falla en tiempo de ejecución con una salida basura o un error de ejecución ordinario.

Deliberadamente no existe un mensaje de error propio y específico de la clave: una clave fallida es indistinguible de cualquier otro fallo en tiempo de ejecución. Por eso, cuando un bundle protegido por la VM lanza un error solo una vez que esta opción entra en juego, compruebe primero la ruta de la clave - que el getter se resuelve en la página, devuelve una cadena no vacía y devuelve el mismo valor con el que compiló.