¿Cómo permitir que Spring Framework cargue archivos .class cifrados?
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)){ p>
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.