Encriptar información con Java

Hola señores, en este segundo articulo sobre encriptación vamos a ver otro ejemplo, ahora un poco mas complicado para que si alguien llegue a obtener esos datos, les sea difícil de descifrar.

Para empezar en nuestro archivo pom.xml, vamos a agregar la siguiente dependencia de Apache Commons Codec 1.10 (más información aqui).

Con esta libreria podemos encriptar y desencriptar usando MD5SHARSA y AES.

Código de Ejemplo

pom.xml

<dependency>
   <groupId>commons-codec</groupId>
   <artifactId>commons-codec</artifactId>
   <version>1.10</version>
</dependency>

Clase Ejemplo

Luego creamos una clase util, que nos va a servir mucho para no duplicar código.

package ar.com.juanlopez;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import static org.apache.commons.codec.binary.Base64.decodeBase64;
import static org.apache.commons.codec.binary.Base64.encodeBase64;

/**
 * @author jlopez
 */
public class EncryptUtil {
    // Definición del tipo de algoritmo a utilizar (AES, DES, RSA)
    private final static String alg = "AES";
    // Definición del modo de cifrado a utilizar
    private final static String cI = "AES/CBC/PKCS5Padding";

    /**
     * Función de tipo String que recibe una llave (key), un vector de inicialización (iv)
     * y el texto que se desea cifrar
     * @param key la llave en tipo String a utilizar
     * @param iv el vector de inicialización a utilizar
     * @param cleartext el texto sin cifrar a encriptar
     * @return el texto cifrado en modo String
     * @throws Exception puede devolver excepciones de los siguientes tipos: NoSuchAlgorithmException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, NoSuchPaddingException
     */
    public static String encrypt(String key, String iv, String cleartext) throws Exception {
        Cipher cipher = Cipher.getInstance(cI);
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), alg);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivParameterSpec);
        byte[] encrypted = cipher.doFinal(cleartext.getBytes());
        return new String(encodeBase64(encrypted));
    }

    /**
     * Función de tipo String que recibe una llave (key), un vector de inicialización (iv)
     * y el texto que se desea descifrar
     * @param key la llave en tipo String a utilizar
     * @param iv el vector de inicialización a utilizar
     * @param encrypted el texto cifrado en modo String
     * @return el texto desencriptado en modo String
     * @throws Exception puede devolver excepciones de los siguientes tipos: NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException
     */
    public static String decrypt(String key, String iv, String encrypted) throws Exception {
        Cipher cipher = Cipher.getInstance(cI);
        SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), alg);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv.getBytes());
        byte[] enc = decodeBase64(encrypted);
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivParameterSpec);
        byte[] decrypted = cipher.doFinal(enc);
        return new String(decrypted);
    }
}

Manos a la obra…

Bueno ya tenemos lo importante para poder encriptar cualquier información, como verán se encripta solamente String.

Para probar nuestro Util podemos hacer lo siguiente:

package ar.com.juanlopez;
 
/**
 * @author Julio Chinchilla
 */
public class Main {
 
    public static void main(String[] args) throws Exception {
    String key = "6AS5D4C5R5D5E6D6"; //KEY
    String iv = "0123456789ABCDEF"; // vector de inicialización usado en iv
    String cleartext = "JLopez";
    System.out.println("Encriptado: "+EncryptUtil.encrypt(key, iv, cleartext));
    System.out.println("Desencriptado: "+EncryptUtil.decrypt(key, iv, cleartext));
 }
 
}

y en la salida tendremos lo siguiente:

Encriptado: EtOsozq+gHO/yFPNA39fYw==
Desencriptado: JLopez

Bueno espero les guste el artículo, espero sus comentarios.

LEAVE YOUR COMMENTS