Externalizar la clave de cifrado del array de bytecode
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.
vmBytecodeArrayEncodingKeyse 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
vmBytecodeArrayEncodingKeyGetterse 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.
La clave debe existir antes de que se ejecute el código ofuscado:
Otras fuentes síncronas funcionan de la misma manera - elija la que su aplicación ya rellene:
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.
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.
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ó.
