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:
Ejemplo de desencriptación:
- 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 .
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