Encriptación AES para desarrolladores Cuándo se necesita y cómo funciona
Si almacenas datos sensibles — información personal de los usuarios, claves de API, registros financieros — la encriptación AES es la herramienta que debes usar. Es la norma industrial para la encriptación simétrica en reposo: rápida, probada y soportada nativamente en todos los principales lenguajes.
Pero si usas AES de forma incorrecta, es peor que inútil. El modo ECB revela patrones. Reutilizar un IV con GCM rompe completamente su garantía de seguridad. Y almacenar tu clave junto al cifrado anula todo el propósito.
Aquí tienes lo que realmente necesitas para usar AES correctamente en producción.
¿Qué es AES?
AES (Advanced Encryption Standard) es un cifrado simétrico en bloques. Simétrico significa que la misma clave se utiliza para cifrar y descifrar. Cifrado en bloques significa que opera en bloques fijos de 128 bits de datos.
Reemplazó a DES en 2001, y hoy está en todos lados: TLS, encriptación de discos, gestores de contraseñas, encriptación de campos en bases de datos. A diferencia de la encriptación asimétrica (RSA, ECDH), AES es lo suficientemente rápido como para cifrar grandes cantidades de datos en tiempo real. El costo: ambas partes necesitan la misma clave, por lo que la distribución de claves se convierte en tu problema.
AES-128 vs AES-256: ¿Qué tamaño de clave?
AES tiene tres tamaños de clave: 128, 192 y 256 bits. En la práctica, elegirás entre 128 y 256.
| AES-128 | AES-256 | |
|---|---|---|
| Longitud de clave | 128 bits | 256 bits |
| Rondas | 10 | 14 |
| Actuación | Más rápida | Aproximadamente 401 TP7T más lenta |
| Seguridad | Fuerte — no existe ataque práctico conocido | Más fuerte — resistente al futuro ante computadoras cuánticas |
| Veredicto | Adecuada para la mayoría de las aplicaciones | Usa para datos de alta sensibilidad o con larga retención |
AES-128 no está roto. No existe un ataque práctico. Pero si estás cifrando datos que deben permanecer seguros durante más de 20 años — o si tu modelo de amenaza incluye computadoras cuánticas — AES-256 añade un margen significativo. Para la mayoría de las aplicaciones que cifran campos de base de datos hoy, AES-128 es suficiente. Si tienes dudas, usa AES-256; la pérdida de rendimiento es insignificante para cargas típicas.
Modo de operación: ¿Por qué GCM, no ECB?
AES solo cifra un bloque de 128 bits. Para datos reales necesitas un modo de operación que maneje múltiples bloques y los ordene correctamente. Esta elección es crucial.
| Modo | Autenticado | Se requiere IV | Veredicto |
|---|---|---|---|
| ECB | No | No | Nunca uses — el texto plano idéntico produce texto cifrado idéntico, revela patrones |
| CBC | No | Sí | Obsoleto — no tiene autenticación, vulnerable a ataques de orificio de padding |
| GCM | Sí (AEAD) | Sí (nonce) | Usa este — cifra y autentica en una sola pasada |
Usa GCM. GCM (Galois/Counter Mode) es un cifrado AEAD — Encriptación autenticada con datos asociados. Hace dos cosas al mismo tiempo:
- Cifra tus datos para que sean ininteligibles sin la clave
- Genera una etiqueta de autenticación para que cualquier modificación sea detectada inmediatamente
Sin autenticación, un atacante puede invertir bits en tu cifrado y tú descifrarás basura sin darte cuenta. Con GCM, la descifrado falla de forma evidente si el cifrado fue modificado — antes de que se devuelva cualquier texto plano.
El IV/Nonce: Aleatorio, nunca reutilizado
GCM requiere un vector de inicialización (IV), también llamado nonce — "número usado una vez". El IV no necesita ser secreto, pero debe ser:
- Aleatorio — generado con un generador de números aleatorios de seguridad criptográfica
- Único — nunca reutilizado con la misma clave
Reutilizar un IV con la misma clave en GCM es catastrófico. Un atacante que ve dos cifrados con la misma clave y IV puede XOR ellos y recuperar ambos textos planos. Esto no es teórico — ha ocurrido en sistemas en producción.
Usa un IV aleatorio de 96 bits (12 bytes) por operación de cifrado. Como necesitas el IV para descifrar, guárdalo junto al cifrado — colocar el IV al principio del cifrado es la forma convencional.
Código funcional: AES-256-GCM
Aquí tienes fragmentos listos para producción. Ambos almacenan el IV y la etiqueta de autenticación junto al cifrado para que la descifrado sea autónoma.
Node.js
const crypto = require('crypto');
const ALGORITHM = 'aes-256-gcm';
const KEY_LENGTH = 32; // 256 bits
const IV_LENGTH = 12; // 96 bits — recommended for GCM
const TAG_LENGTH = 16; // 128-bit auth tag
function encrypt(plaintext, key) {
const iv = crypto.randomBytes(IV_LENGTH);
const cipher = crypto.createCipheriv(ALGORITHM, key, iv);
const encrypted = Buffer.concat([
cipher.update(plaintext, 'utf8'),
cipher.final(),
]);
const tag = cipher.getAuthTag();
// Layout: [iv (12)] + [tag (16)] + [ciphertext]
return Buffer.concat([iv, tag, encrypted]).toString('base64');
}
function decrypt(ciphertextB64, key) {
const data = Buffer.from(ciphertextB64, 'base64');
const iv = data.subarray(0, IV_LENGTH);
const tag = data.subarray(IV_LENGTH, IV_LENGTH + TAG_LENGTH);
const encrypted = data.subarray(IV_LENGTH + TAG_LENGTH);
const decipher = crypto.createDecipheriv(ALGORITHM, key, iv);
decipher.setAuthTag(tag);
return Buffer.concat([decipher.update(encrypted), decipher.final()]).toString('utf8');
}
// Usage
const key = crypto.randomBytes(KEY_LENGTH); // store this securely
const ciphertext = encrypt('sensitive data here', key);
const plaintext = decrypt(ciphertext, key);
Pitón
import os, base64
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
IV_LENGTH = 12 # 96 bits
def encrypt(plaintext: str, key: bytes) -> str:
iv = os.urandom(IV_LENGTH)
aesgcm = AESGCM(key)
# encrypt() appends the 16-byte auth tag automatically
ciphertext = aesgcm.encrypt(iv, plaintext.encode(), None)
return base64.b64encode(iv + ciphertext).decode()
def decrypt(ciphertext_b64: str, key: bytes) -> str:
data = base64.b64decode(ciphertext_b64)
iv = data[:IV_LENGTH]
ciphertext = data[IV_LENGTH:]
aesgcm = AESGCM(key)
return aesgcm.decrypt(iv, ciphertext, None).decode()
# Usage
key = AESGCM.generate_key(bit_length=256) # store this securely
ciphertext = encrypt('sensitive data here', key)
plaintext = decrypt(ciphertext, key)
Instala la dependencia: pip install cryptography
Puedes probar la encriptación y descifrado de AES de forma interactiva — sin configuración previa — usando el IO Tools Herramienta de encriptación/decodificación de AES.
Gestión de claves: la parte difícil
Tu encriptación es tan fuerte como tu gestión de claves. Los errores más comunes:
- La clave en la misma base de datos que los datos cifrados — si un atacante obtiene tu copia de base de datos, obtiene ambas.
- La clave en control de fuentes (git) — incluso si está ignorada en git
.env, la rotación se vuelve difícil y el historial persiste. - La clave en los registros — los registros de la aplicación se envían a agregadores. Las claves nunca deben aparecer allí.
Dónde almacenar realmente las claves de encriptación:
- AWS KMS / Google Cloud KMS / Azure Key Vault — almacenamiento de claves gestionado con historiales de auditoría y rotación automática
- HashiCorp Vault — autogestionado, adecuado para entornos multiclou
- Variables de entorno — aceptable para cargas de trabajo de baja sensibilidad con superficie de exposición limitada
Para la encriptación de campos en bases de datos, el patrón estándar es la encriptación envolvente: genera una clave de encriptación de datos (DEK) por registro o columna, luego cifra la DEK con una clave maestra almacenada en un KMS. Tu base de datos contiene solo DEKs cifrados y cifrados — la clave maestra nunca toca la base de datos.
Cuándo usar AES — y cuándo no
AES es la herramienta adecuada para:
- Cifrar campos en una base de datos — números de SSN, números de tarjetas, registros médicos
- Cifrar archivos en reposo antes de almacenarlos en la nube
- Compartir secretos entre servicios que comparten una clave preestablecida
AES no es la herramienta adecuada cuando:
- Estás transmitiendo datos por una red — usa TLS. No desarrolles tu propio protocolo de transporte.
- Necesitas encriptación asimétrica — si el remitente y el destinatario no pueden compartir una clave de antemano, usa RSA o ECDH para el intercambio de claves.
- Estás almacenando contraseñas — usa bcrypt, scrypt o Argon2. Las contraseñas cifradas pueden descifrarse; las correctamente hashadas no pueden.
- Una solución gestionada es adecuada — AWS Secrets Manager, Vault y similares manejan rotación, control de acceso y registros de auditoría de forma automática. Prefiere eso sobre AES manual si cubre tus necesidades.
El error que cometen la mayoría de los desarrolladores es tratar a AES como una solución completa de seguridad. Es un primitivo — un bloque de construcción. Acompáñalo con un modo autenticado (GCM), IVs únicos por operación y una gestión adecuada de claves, y será extremadamente efectivo. Omitir cualquier pieza de esto te construye algo que parece seguro pero no lo es.
También te puede interesar
Instalar extensiones
Agregue herramientas IO a su navegador favorito para obtener acceso instantáneo y búsquedas más rápidas
恵 ¡El marcador ha llegado!
Marcador es una forma divertida de llevar un registro de tus juegos, todos los datos se almacenan en tu navegador. ¡Próximamente habrá más funciones!
Herramientas clave
Ver todo Los recién llegados
Ver todoActualizar: Nuestro última herramienta fue agregado el 17 de mayo de 2026
