¿Odias los anuncios? Ir Sin publicidad Hoy

Encriptación AES para desarrolladores Cuándo se necesita y cómo funciona

Publicado el
Encriptación AES para desarrolladores: cuándo necesitas y cómo funciona 1
ANUNCIO · ¿ELIMINAR?

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-128AES-256
Longitud de clave128 bits256 bits
Rondas1014
ActuaciónMás rápidaAproximadamente 401 TP7T más lenta
SeguridadFuerte — no existe ataque práctico conocidoMás fuerte — resistente al futuro ante computadoras cuánticas
VeredictoAdecuada para la mayoría de las aplicacionesUsa 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.

ModoAutenticadoSe requiere IVVeredicto
ECBNoNoNunca uses — el texto plano idéntico produce texto cifrado idéntico, revela patrones
CBCNoObsoleto — no tiene autenticación, vulnerable a ataques de orificio de padding
GCMSí (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:

  1. Cifra tus datos para que sean ininteligibles sin la clave
  2. 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.

¿Quieres eliminar publicidad? Adiós publicidad hoy

Instalar extensiones

Agregue herramientas IO a su navegador favorito para obtener acceso instantáneo y búsquedas más rápidas

añadir Extensión de Chrome añadir Extensión de borde añadir Extensión de Firefox añadir Extensión de Opera

¡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!

ANUNCIO · ¿ELIMINAR?
ANUNCIO · ¿ELIMINAR?
ANUNCIO · ¿ELIMINAR?

Noticias Aspectos técnicos clave

Involucrarse

Ayúdanos a seguir brindando valiosas herramientas gratuitas

Invítame a un café
ANUNCIO · ¿ELIMINAR?