Criptografía en Java: cifrado y hash — guía completa

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 — guía detallada



En el mundo moderno de la seguridad de la información, la criptografía es la base de la protección de datos. Java proporciona un potente conjunto de herramientas integradas para implementar cifrado y hash a través de los paquetes javax.crypto y java.security. En este artículo, analizaremos en detalle las principales operaciones criptográficas en Java: cifrado simétrico y asimétrico, hash de contraseñas y trabajo con firmas digitales.



1. Fundamentos de criptografía en Java

Java Cryptography Architecture (JCA) es un framework que permite a los desarrolladores integrar fácilmente algoritmos criptográficos. Clases clave:

  • javax.crypto.Cipher — para cifrado y descifrado.
  • java.security.MessageDigest — para hash.
  • java.security.KeyPairGenerator — para generación de claves.
  • javax.crypto.spec.SecretKeySpec — para crear claves simétricas.

Para trabajar con criptografía, importe:

import javax.crypto.*;import javax.crypto.spec.*;import java.security.*;


2. Cifrado simétrico (AES)

El cifrado simétrico utiliza una sola clave para cifrar y descifrar. AES (Advanced Encryption Standard) es el algoritmo más popular. Ejemplo de cifrado de una cadena:

import javax.crypto.*;import javax.crypto.spec.*;import java.util.Base64;

public class AesExample { public static void main(String[] args) throws Exception { String plainText = "Mensaje secreto"; String secretKey = "0123456789abcdef"; // 16 bytes para AES-128

// Creación de la clave SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");

// Cifrado cipher.init(Cipher.ENCRYPT_MODE, keySpec); byte[] encryptedBytes = cipher.doFinal(plainText.getBytes()); String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes); System.out.println("Cifrado: " + encryptedText);

// Descifrado cipher.init(Cipher.DECRYPT_MODE, keySpec); byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText)); String decryptedText = new String(decryptedBytes); System.out.println("Descifrado: " + decryptedText); }}

Importante: El modo ECB no se recomienda para grandes volúmenes de datos. Use AES/GCM/NoPadding para mayor seguridad.



3. Cifrado asimétrico (RSA)

El cifrado asimétrico utiliza un par de claves: pública (para cifrar) y privada (para descifrar). RSA es el algoritmo clásico. Ejemplo:

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

public class RsaExample { public static void main(String[] args) throws Exception { // Generación del par de claves KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(2048); KeyPair pair = keyGen.generateKeyPair(); PublicKey publicKey = pair.getPublic(); PrivateKey privateKey = pair.getPrivate();

// Cifrado con clave pública Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] encryptedBytes = cipher.doFinal("Datos secretos".getBytes()); String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes); System.out.println("Cifrado con RSA: " + encryptedText);

// Descifrado con clave privada cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));

Recommendations