Criptografía en Java: cifrado y hash de datos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Criptografía en Java: cifrado y hash



En el mundo moderno de la seguridad de la información, la criptografía juega un papel clave. Java proporciona potentes herramientas integradas para implementar operaciones criptográficas a través de Java Cryptography Architecture (JCA) y Java Cryptography Extension (JCE). En este artículo, analizaremos en detalle los mecanismos principales: cifrado simétrico, cifrado asimétrico y hash, además de proporcionar ejemplos prácticos de código.



Conceptos básicos de criptografía

Antes de pasar al código, es importante entender la diferencia entre los primitivos criptográficos principales:

  • Cifrado simétrico — utiliza la misma clave para cifrar y descifrar datos. Es rápido, pero requiere una transmisión segura de la clave.
  • Cifrado asimétrico — utiliza un par de claves: pública (para cifrar) y privada (para descifrar). Es más lento, pero resuelve el problema del intercambio de claves.
  • Hash — transformación irreversible de datos en una cadena de longitud fija. Se utiliza para verificar la integridad y almacenar contraseñas.


Cifrado simétrico AES en Java

AES (Advanced Encryption Standard) es el algoritmo simétrico más popular. En Java, se trabaja con él a través de la clase Cipher. Veamos un ejemplo de cifrado y descifrado de una cadena:



import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;import java.util.Base64;

public class AesExample { public static void main(String[] args) throws Exception { // Generación de clave AES-128 KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(128); SecretKey secretKey = keyGen.generateKey(); // Mensaje original String originalMessage = "¡Hola, criptografía!"; System.out.println("Mensaje original: " + originalMessage); // Cifrado Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptedBytes = cipher.doFinal(originalMessage.getBytes("UTF-8")); String encryptedMessage = Base64.getEncoder().encodeToString(encryptedBytes); System.out.println("Mensaje cifrado: " + encryptedMessage); // Descifrado cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedMessage)); String decryptedMessage = new String(decryptedBytes, "UTF-8"); System.out.println("Mensaje descifrado: " + decryptedMessage); }}


En el ejemplo se utiliza el modo ECB (Electronic Codebook) con relleno PKCS5Padding. Para producción, se recomienda usar modos más seguros como CBC o GCM.



Cifrado asimétrico RSA

RSA es el algoritmo asimétrico clásico. En Java, se utilizan las clases KeyPairGenerator y Cipher para trabajar con él. Es importante recordar: RSA solo puede cifrar datos hasta el tamaño de la clave (generalmente 2048 bits). Para volúmenes grandes de datos, RSA se combina con cifrado simétrico (esquema híbrido).



import javax.crypto.Cipher;import java.security.*;import java.util.Base64;

public class RsaExample { public static void main(String[] args) throws Exception { // Generación de par de claves RSA-2048 KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); KeyPair keyPair = keyGen.generateKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); String secretMessage = "Datos secretos"; System.out.println("Mensaje original: " + secretMessage); // Cifrado con clave pública

Recommendations