Métodos para Encriptar y Desencriptar en Java
En esta oportunidad presentamos 2 métodos para proteger los datos en sus desarrollos. Los métodos contienen una llave escrita en duro “qualityinfosolutions” que es la que nos permite Encriptar y luego Desencriptar nuestros datos, si las llaves no coinciden no podrán utilizar ambos métodos por lo que es recomendable manejar esta llave como una variable global.
Librerias:
import java.security.MessageDigest;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
Descargar commons-codec-1.9.jar
Commons-codec (257.8 KiB)
Método de Encriptación
public static String Encriptar(String texto) { String secretKey = "qualityinfosolutions"; //llave para encriptar datos String base64EncryptedString = ""; try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] digestOfPassword = md.digest(secretKey.getBytes("utf-8")); byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); SecretKey key = new SecretKeySpec(keyBytes, "DESede"); Cipher cipher = Cipher.getInstance("DESede"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] plainTextBytes = texto.getBytes("utf-8"); byte[] buf = cipher.doFinal(plainTextBytes); byte[] base64Bytes = Base64.encodeBase64(buf); base64EncryptedString = new String(base64Bytes); } catch (Exception ex) { } return base64EncryptedString; }
public static String Desencriptar(String textoEncriptado) throws Exception { String secretKey = "qualityinfosolutions"; //llave para desenciptar datos String base64EncryptedString = ""; try { byte[] message = Base64.decodeBase64(textoEncriptado.getBytes("utf-8")); MessageDigest md = MessageDigest.getInstance("MD5"); byte[] digestOfPassword = md.digest(secretKey.getBytes("utf-8")); byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); SecretKey key = new SecretKeySpec(keyBytes, "DESede"); Cipher decipher = Cipher.getInstance("DESede"); decipher.init(Cipher.DECRYPT_MODE, key); byte[] plainText = decipher.doFinal(message); base64EncryptedString = new String(plainText, "UTF-8"); } catch (Exception ex) { } return base64EncryptedString; }
Forma de uso suponiendo que fue creada en la clase utilidades como se muestra a continuación:
Clase AppUtilidades
package com.quality; import com.quality.entidades.Utilidades; public class AppUtilidades { public static void main(String[] args) throws Exception { String encriptado = Utilidades.Encriptar("Esto es una prueba"); System.out.println(encriptado); String desencriptado = Utilidades.Desencriptar(encriptado); System.out.println(desencriptado); } }
Clase Utilidades
package com.quality.entidades; import java.security.MessageDigest; import java.util.Arrays; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; public class Utilidades { public static String Encriptar(String texto) { String secretKey = "qualityinfosolutions"; //llave para encriptar datos String base64EncryptedString = ""; try { MessageDigest md = MessageDigest.getInstance("MD5"); byte[] digestOfPassword = md.digest(secretKey.getBytes("utf-8")); byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); SecretKey key = new SecretKeySpec(keyBytes, "DESede"); Cipher cipher = Cipher.getInstance("DESede"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] plainTextBytes = texto.getBytes("utf-8"); byte[] buf = cipher.doFinal(plainTextBytes); byte[] base64Bytes = Base64.encodeBase64(buf); base64EncryptedString = new String(base64Bytes); } catch (Exception ex) { } return base64EncryptedString; } public static String Desencriptar(String textoEncriptado) throws Exception { String secretKey = "qualityinfosolutions"; //llave para encriptar datos String base64EncryptedString = ""; try { byte[] message = Base64.decodeBase64(textoEncriptado.getBytes("utf-8")); MessageDigest md = MessageDigest.getInstance("MD5"); byte[] digestOfPassword = md.digest(secretKey.getBytes("utf-8")); byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24); SecretKey key = new SecretKeySpec(keyBytes, "DESede"); Cipher decipher = Cipher.getInstance("DESede"); decipher.init(Cipher.DECRYPT_MODE, key); byte[] plainText = decipher.doFinal(message); base64EncryptedString = new String(plainText, "UTF-8"); } catch (Exception ex) { } return base64EncryptedString; } }
excelente información una pregunta tengo una tarea que hacer es la siguiente:
Carlos le quiere decir mediante un mensaje “HOLA” a su novia Rebeca, pero no quiere que si alguien intercepte el mensaje logre entender el contenido del mismo, para esto debe aplicar un tipo de encriptación a su mensaje (le dice a un algoritmo que tome su mensaje y lo modifique de manera que solo Rebeca pueda entender el contenido real del mensaje) por ejemplo si el mensaje es hola y le aplica el algoritmo pareciera que el mensaje dice “”LSPE”, lo que hizo el algoritmo fue cambiar la cada letra por la cuarta letra siguiente en el abecedario
Muchas Gracias muy efectivo tu metodo
Excelente, muy buen post, yo tenia un en vb.net y estaba buscando algo parecido en Java, funcionó perfectamente. Gracias por tu tiempo y dedicación.
Hola, probe el codigo pero con AES en lugar de DESede pero no funciona cual seria el problema o no tiene compatibilidad con AES?
java.lang.NoClassDefFoundError: org/apache/commons/codec/binary/Base64
me tira ese error
Agregaste el jar que sale al principio?? (commons-codec-1.9.jar)
Atte,
Víctor Riquelme Rojas
quisiera saber si existe un equivalente en php
No tenemos el equivalente en PHP lo sentimos, pero debes buscar por Triple DES
Genial
Buenas tardes, excelente encriptador.. una ayuda si quisiera retirar un caracter del string encriptado? por ejemplo de devuelve «phd12/ewew» y no quiero el «/» en el string.
Saludos!
si quitas cualquier carácter del resultado luego no podrás desencriptar la cadena resultante.
En primer lugar deberías validar el universo total de caracteres generados por el método, por ejemplo no creo que genere un espacio en blanco » «, si ese fuese el caso luego de encriptar el valor podrías reemplazar el caracter que no desees por el caracter de reemplazo que desees, la cadena resultante sería el valor encriptado.
Al momento de desencriptar deberías hacer lo inverso, reemplazar el caracter que usaste como reemplazo, por el caracter inicial, y aplicar la función de desencriptar.
Alguien tiene el equivalente a esos dos metodos en c#?
No se que pasa me tira el siguiente error
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:989)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:845)
at com.sun.crypto.provider.DESedeCipher.engineDoFinal(DESedeCipher.java:294)
at javax.crypto.Cipher.doFinal(Cipher.java:2165)
at Componentes.EncryptionMD5.Desencriptar(EncryptionMD5.java:75)
at Ventanas.EditarPerfilTecnico.(EditarPerfilTecnico.java:53)
at Ventanas.PerfilTecnico.jMenuItem1ActionPerformed(PerfilTecnico.java:394)
at Ventanas.PerfilTecnico.access$300(PerfilTecnico.java:19)
at Ventanas.PerfilTecnico$4.actionPerformed(PerfilTecnico.java:277)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
Hay conection
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.AbstractButton.doClick(AbstractButton.java:376)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:833)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:877)
at java.awt.Component.processMouseEvent(Component.java:6533)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6298)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
Hola, yo tengo un problema, estoy utilizando una BD que ya está previamente hecha en postgresql y no la puedo modificar, entonces en esa base existe la contraseña cifrada con la funcion md5 propia de postgresql pero al aplicar el cifrado en java, no coincide con la almacenada en postgreql, alguien sabe como igualar ese mismo cifrado de postgres en java?
Sugiero que ejecutes la sentencia tal cual la ejecutas en Postgressql, sin hace uso de algun método creado en Java, al hacer el .executeQuery(«insert into….»); da la instrucción como si estuvieras en el editor de Postgresql.
Hola puedes usar funciones de PL y llamarlos en java
Que tal, fue de mucha ayuda el post, por si alguien lo necesita en Swift3 te dejo el enlace
https://github.com/danigarciaalva/CipherAlgorithm