
5.0 / 5
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 MD5, SHA, RSA y AES.
pom.xml
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.10</version> </dependency>
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); } }
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.