0Pricing
Java Academy · Lección

Cifrado simétrico AES

Cifre y descifre datos confidenciales con AES/CBC/PKCS5Padding mediante la API javax.crypto de Java.

Cifrado simétrico AES es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

Cifrado simétrico frente a asimétrico

El cifrado simétrico utiliza la misma clave para cifrar y descifrar (es rápido y adecuado para grandes volúmenes de datos). El cifrado asimétrico utiliza un par de claves pública y privada (es más lento y se emplea para el intercambio de claves y las firmas). AES es el cifrado simétrico estándar.

Modos de AES: CBC frente a GCM

AES tiene varios modos. AES/CBC/PKCS5Padding es común, pero no proporciona autenticación. AES/GCM/NoPadding ofrece cifrado y autenticación (AEAD), por lo que se recomienda encarecidamente para código nuevo.

Generación de una clave AES

Utilice KeyGenerator para generar de forma segura una clave AES de 256 bits.

KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(256); // 256-bit key
SecretKey key = kg.generateKey();
// Persist the key:
String b64Key = Base64.getEncoder().encodeToString(key.getEncoded());
// Restore the key:
byte[] decoded = Base64.getDecoder().decode(b64Key);
SecretKey restored = new SecretKeySpec(decoded, "AES");

Cifrado AES/GCM

El modo GCM requiere un vector de inicialización (IV) único de 12 bytes para cada cifrado. Genere un IV aleatorio nuevo para cada operación de cifrado; no reutilice nunca un IV con la misma clave.

byte[] iv = new byte[12]; // 96-bit IV for GCM
new SecureRandom().nextBytes(iv);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec spec = new GCMParameterSpec(128, iv); // 128-bit auth tag
cipher.init(Cipher.ENCRYPT_MODE, key, spec);
byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
// Transmit/store: IV + ciphertext (IV is not secret)

Descifrado AES/GCM

Extraiga el IV de los datos almacenados, reconstruya la especificación y descifre. GCM verifica automáticamente la autenticidad; los datos manipulados provocan una AEADBadTagException.

// Assume stored = iv + ciphertext:
byte[] iv         = Arrays.copyOfRange(stored, 0, 12);
byte[] ciphertext = Arrays.copyOfRange(stored, 12, stored.length);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, key, new GCMParameterSpec(128, iv));
byte[] plaintext = cipher.doFinal(ciphertext); // throws if tampered

Almacenamiento del IV con el texto cifrado

El IV no es secreto: almacénelo delante del texto cifrado o junto a él. El receptor necesita el IV para descifrar. La clave debe mantenerse en secreto.

byte[] encryptedData = new byte[iv.length + ciphertext.length];
System.arraycopy(iv,         0, encryptedData, 0,          iv.length);
System.arraycopy(ciphertext, 0, encryptedData, iv.length, ciphertext.length);
String b64 = Base64.getEncoder().encodeToString(encryptedData);

Derivación de claves a partir de una contraseña (PBKDF2)

No utilice nunca una contraseña directamente como clave AES, ya que su entropía es demasiado baja. Derive una clave con PBKDF2 utilizando una sal aleatoria y un número elevado de iteraciones.

PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 310_000, 256);
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
byte[] keyBytes = skf.generateSecret(spec).getEncoded();
SecretKey key = new SecretKeySpec(keyBytes, "AES");

Uso del proveedor de seguridad de Java

El proveedor predeterminado del JDK gestiona AES. Para utilizar algoritmos adicionales o cumplir con FIPS, utilice el proveedor Bouncy Castle.

// With Bouncy Castle:
Security.addProvider(new BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");

Patrón de cifrado de sobre

Cifre los datos con una clave de cifrado de datos (DEK) generada aleatoriamente. Cifre la DEK con una clave de cifrado de claves (KEK) almacenada en un KMS (AWS KMS, HashiCorp Vault). Esto limita la exposición de las claves.

AES en aplicaciones Spring

TextEncryptor de Spring Security o el módulo Spring Security Crypto proporcionan cifrado AES de alto nivel sin tener que gestionar manualmente Cipher/IV.

TextEncryptor encryptor = Encryptors.text(password, salt);
String encrypted = encryptor.encrypt("sensitive data");
String decrypted = encryptor.decrypt(encrypted);

Errores comunes

No haga nunca lo siguiente: reutilizar un IV con la misma clave, utilizar el modo ECB (conserva los patrones), usar directamente una contraseña como clave o ignorar la etiqueta de autenticación. Utilice siempre GCM en código nuevo.

Comprobación rápida

¿Qué proporciona AES/GCM que no proporciona AES/CBC?

Resumen

Utilice AES/GCM/NoPadding para obtener cifrado autenticado. Genere un IV aleatorio nuevo de 12 bytes para cada cifrado. Anteponer el IV al texto cifrado. Derive las claves a partir de contraseñas con PBKDF2. No reutilice nunca un IV con la misma clave.

Preguntas frecuentes

¿La lección «Cifrado simétrico AES» es gratis?

Sí — el texto completo de «Cifrado simétrico AES» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Cifrado simétrico AES»?

Cifre y descifre datos confidenciales con AES/CBC/PKCS5Padding mediante la API javax.crypto de Java. Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Cifrado simétrico AES»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Hash criptográfico con MessageDigest
  2. Cifrado simétrico AES
  3. HMAC-SHA256 para la integridad de mensajes
  4. JWT: estructura, creación y verificación
← Volver a Java Academy