Red de conocimiento informático - Conocimiento informático - ¿Cómo permitir que Spring Framework cargue archivos .class cifrados?

¿Cómo permitir que Spring Framework cargue archivos .class cifrados?

Cifrado: utilice cifrado AES, lea el código de bytes del archivo, cifre el código de bytes y reemplace el archivo fuente

Código Java

/**

* < / p>

* Cifrado de bytes

*/

byte estático público[] cifrado(byte[] datos, clave de cadena) lanza una excepción {

Clave k = toKey(Base64.decode(clave));

byte[] raw = k.getEncoded();

SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM); p>

Cifrado cifrado = Cifrado.

Cifrado cifrado = Cipher.getInstance(ALGORITHM);

cipher.init(Cipher.ENCRYPT_ MODE, secretKeySpec

);

p>

return cipher.doFinal(datos

}

/**

*

* Cifrado de bytes

*/

byte estático público[] cifrado(byte[] datos, clave de cadena) arroja una excepción {

Clave k = toKey(Base64. decodificar(clave ));

byte[] raw = k.getEncoded();

SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);

Cifrado cifrado = Cifrado .getInstance(ALGORITHM);

cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);

devuelve cipher.doFinal(datos);

}

Descifrado:

1. Modifique el código fuente en WebappClassLoader de Tomcat (cargador de clases definido automáticamente)

2. Modifique el código fuente del código fuente de Spring; paquete.

Método de cifrado

Código Java

byte estático público[] descifrar(byte[] datos, clave de cadena) arroja una excepción {

Clave k = toKey(Base64.decode(clave) );

byte[] raw = k.getEncoded();

SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM); /p>

Cifrado cifrado = Cipher.getInstance(ALGORITHM);

cipher.init(Cipher.DECRYPT_MODE, secretKeySpec

return cipher.doFinal(data); /p>

}

byte estático público[] descifrar(byte[] datos, clave de cadena) arroja una excepción {

Clave k = toKey(Base64.decode(clave) );

byte[] raw = k.getEncoded ();

SecretKeySpec secretKeySpec = new SecretKeySpec(raw, ALGORITHM);

Cifrado = Cifrado. getInstance(ALGORITHM);

cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);

devuelve cipher.doFinal(datos);

Cipher.doFinal(datos )doFinal(data);

}

Descifrado en WebappClassLoader

Código Java

/**

* Determinar si es una clase que necesita ser descifrada para el procesamiento de datos

* */

//---------------- --- ------------------comenzar---------------------------- ----- --- -/

byte []data=null;

prueba {

if(isDecode(nombre)){

System.out.println("2818:--amp;amp;amp;-" nombre);

data=AESUtils.decrypt(entry.binaryContent, clave

} else{

data=entry.binaryContent;

}

} catch (Excepción e) {

e .printStackTrace();

}

prueba {

clazz = defineClass(nombre, datos

, 0,

data.length,

new CodeSource(entry.codeBase, Entry.certificates));

SimpleMetadataReader( Recurso de recursos, ClassLoader classLoader)

lanza IOException {

InputStream es = recurso.getInputStream()

ClassReader classReader = null

prueba {

String name = "";

if (resource.getURI().toString().indexOf ("jar:file") == -1) {

nombre = recurso.getFile().getAbsolutePath();

if (!"" .equals(nombre) amp; amp; isDecode(nombre, cámaras)) {

byte[] datos = inputStreamToByte(es);

prueba {

es = nuevo ByteArrayInputStream(AESUtils.decrypt(datos,

clave) );

// es = new ByteArrayInputStream(data);

} catch (Excepción e) {

e.printStackTrace();

}

}

}

}

classReader = nuevo ClassReader(es);

} finalmente {

is.close();

}

}

LocalVariableTableParameterNameDiscoverer también debe descifrarse.

Nota: (Este tipo de cifrado tiene desventajas)

1. Los algoritmos de cifrado y descifrado deben ser coherentes.

2. Las claves de cifrado deben ser las mismas.