domingo, 8 de mayo de 2016

Codificar y Decodificar con AES. Parte II: Como codificar y que te funciones contra Salesforce

En el ejemplo anterior, vimos como hacer una encriptación con AES de forma sencilla. Este ejemplo es un poco más complejo. Y además nos permitirá des/encriptar de tal forma que podamos tener una comunicación fluida con las librerías de Salesforce (Apex).

Pero para empezar, vamos profundizar un poco más sobre conceptos de la encriptación:
  • ¿Que es CBC? Es un 'modo de operación' que permite encriptar el conjunto de bloques (los cifrados por AES) entre sí. Más info aquí.
  • ¿Que es IV? Es un vector de inicialización requerido por el modo de operación. Una secuencia unica binaria usada en las operaciones de encriptación. Más info aquí.
La clave en la comunicación con Salesforce, se centra en dos aspectos importantes:
  • El vector de inicialización es parte del texto codificado. El comienzo para ser más concreto.
  • Después de encriptar el texto hay que codificar la respuesta en Base64. Y antes de desencriptarlo hay que decodificar el texto a tratar en Base64 .
Ejemplo de encriptación. El método 'cipherData' ya se indica en el post anterior:

byte[] aEncriptarBytes = cadenaAEncriptar.getBytes();
//generamos un vector de iniciación de 128 bits aleatorio
byte[] iv = new byte[128];
new Random().nextBytes(iv);
//concateno vector de iniciacion mas el texto a encriptar en bytes
byte[] cadenaFinal = new byte[iv.length + aEncriptarBytes.length];
System.arraycopy(iv, 0, cadenaFinal, 0, iv.length);
System.arraycopy(aEncriptarBytes, 0, cadenaFinal, iv.length, aEncriptarBytes.length);
//Creo los objetos que permiten la encriptacion
PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine()));
CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(llave.getBytes()), iv);
aes.init(true, ivAndKey);
//encriptamos el conjunto total de bytes (vector y texto). 
byte[] result = cipherData(aes, cadenaFinal);
//codifico el resultado a base64
byte[] bEncriptados = Base64.encode(cadenaFinal);
String textoEncriptado = new String(encodeObuf);

Ejemplo de desencriptación:

byte[] llaveBytes = llave.getBytes();
byte[] bDesencriptados = null;
// decodificamos el texto a desencriptar
byte[] encryptedTextBytes = Base64.decode(textoEncriptado);
// Descomponemos el texto encriptado. La primera parte incluye el vector de iniciacion
byte[] iv = Arrays.copyOfRange(encryptedTextBytes, 0, 128);
// Obtenemos el texto exacto a desencriptar
byte[] validBytes = Arrays.copyOfRange(encryptedTextBytes, 128, encryptedTextBytes.length);
//Creamos objeto que permite la desencriptacion
PaddedBufferedBlockCipher decryptCipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine()));
ParametersWithIV parameterIV = new ParametersWithIV(new KeyParameter(llaveBytes), iv);
decryptCipher.init(false, parameterIV);
//Procedemos a desencriptar
int bProcesados = decryptCipher.processBytes(validBytes, 0, validBytes.length, bDesencriptados, 0);
decryptCipher.doFinal(bDesencriptados, bProcesados);
textoDesencriptado = new String(bProcesados);

No hay comentarios:

Publicar un comentario