Toolypet
Volver al Blog
Security

Fundamentos de Cifrado - Claves Simetricas vs Asimetricas: Lo que Todo Desarrollador Debe Saber

Si no sabes como funcionan AES, RSA y HTTPS, lee este articulo. Conceptos esenciales de cifrado explicados con ejemplos practicos.

Toolypet Team

Toolypet Team

Development Team

6 min de lectura

Fundamentos de Cifrado: Claves Simetricas vs Asimetricas

"Por favor, cifra estos datos y envialos."

Cuando escuchas esto, sabes exactamente que hacer y como?

Existen dos tipos principales de cifrado. Si no sabes cuando usar cada uno, tu diseno de seguridad podria ser defectuoso.


Cifrado vs Hashing

Primero, aclaremos estos conceptos que suelen confundirse.

CifradoHashing
DireccionBidireccional (descifrable)Unidireccional (irreversible)
PropositoProteccion de datosVerificacion de integridad, almacenamiento de contrasenas
Requiere claveSiNo
EjemplosAES, RSASHA-256, bcrypt

Cifrado: Los datos originales pueden recuperarse Hashing: Los datos originales no pueden recuperarse

Usa hashing para almacenar contrasenas, cifrado para transmitir datos.


Cifrado de Clave Simetrica

Concepto

Cifra con una clave, descifra con la misma clave.

Texto plano + Clave → Cifrado → Texto cifrado
Texto cifrado + Clave → Descifrado → Texto plano

Ejemplo: Una Cerradura

Piensa en la llave de tu casa. Cierras y abres con la misma llave.

Algoritmos Comunes

AlgoritmoLongitud de ClaveEstado
AES-256256bitEstandar actual
AES-128128bitSeguro
3DES168bitLegado
DES56bitVulnerable

Ejemplo de Codigo (Node.js)

const crypto = require('crypto');

// Generar clave (almacenar de forma segura en produccion)
const key = crypto.randomBytes(32);  // AES-256
const iv = crypto.randomBytes(16);   // Vector de inicializacion

// Cifrar
function encrypt(text) {
  const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  return encrypted;
}

// Descifrar
function decrypt(encrypted) {
  const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
  let decrypted = decipher.update(encrypted, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}

const secret = "datos sensibles";
const encrypted = encrypt(secret);
const decrypted = decrypt(encrypted);

console.log(encrypted);   // "a3f8b2c1..."
console.log(decrypted);   // "datos sensibles"

Ventajas y Desventajas

VentajasDesventajas
RapidoProblema de compartir clave
Adecuado para grandes volumenesSi la clave se expone, fin del juego
Implementacion simpleGestion de claves compleja

El Problema de Compartir la Clave

Si A quiere enviar un mensaje cifrado a B, A debe entregar la clave a B primero.

Pero, como entregas esa clave de forma segura?

El cifrado de clave asimetrica resuelve este problema.


Cifrado de Clave Asimetrica

Concepto

Usa dos claves:

  • Clave Publica (Public Key): Cualquiera puede conocerla
  • Clave Privada (Private Key): Nunca debe compartirse
Cifrar con clave publica → Solo la clave privada puede descifrar
Firmar con clave privada → Verificar con clave publica

Ejemplo: Un Buzon

  • Clave publica = Buzon (cualquiera puede dejar una carta)
  • Clave privada = Llave del buzon (solo el dueno puede recoger las cartas)

Algoritmos Comunes

AlgoritmoUsoLongitud de Clave
RSACifrado, firma2048+ bit
ECDSAFirma256+ bit
Ed25519Firma256bit

Ejemplo de Codigo (Node.js RSA)

const crypto = require('crypto');

// Generar par de claves
const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {
  modulusLength: 2048,
});

// Cifrar con clave publica
function encryptWithPublic(text) {
  return crypto.publicEncrypt(publicKey, Buffer.from(text)).toString('base64');
}

// Descifrar con clave privada
function decryptWithPrivate(encrypted) {
  return crypto.privateDecrypt(privateKey, Buffer.from(encrypted, 'base64')).toString();
}

const secret = "datos sensibles";
const encrypted = encryptWithPublic(secret);
const decrypted = decryptWithPrivate(encrypted);

console.log(decrypted);  // "datos sensibles"

Firmas Digitales

Cuando firmas con una clave privada, cualquiera puede verificar quien firmo usando la clave publica.

// Firmar con clave privada
const sign = crypto.createSign('SHA256');
sign.update('mensaje');
const signature = sign.sign(privateKey, 'base64');

// Verificar con clave publica
const verify = crypto.createVerify('SHA256');
verify.update('mensaje');
const isValid = verify.verify(publicKey, signature, 'base64');

console.log(isValid);  // true

Ventajas y Desventajas

VentajasDesventajas
Resuelve el problema de compartir claveLento (1000x mas lento que simetrico)
Permite firmas digitalesNo adecuado para grandes datos
La clave publica se puede distribuir librementeLongitudes de clave mas largas

En la Practica: Usando Ambos Juntos (Cifrado Hibrido)

Asi es como funciona HTTPS.

Proceso

1. Servidor: Genera par de claves RSA publica/privada
2. Cliente: Recibe la clave publica del servidor
3. Cliente: Genera clave de sesion AES
4. Cliente: Cifra la clave de sesion con RSA publica → Envia al servidor
5. Servidor: Descifra la clave de sesion con RSA privada
6. Ambos: Se comunican usando la clave de sesion AES

Por Que Hacerlo Asi

  • RSA: Solo se usa para intercambio de claves (lento pero seguro)
  • AES: Se usa para el cifrado real de datos (rapido)

Usando lo mejor de ambos mundos.


Lista de Verificacion Practica

Al Usar Claves Simetricas (AES)

  • Usar AES-256 o AES-128
  • Generar nuevo IV (vector de inicializacion) para cada cifrado
  • Almacenar claves en variables de entorno o KMS
  • Nunca usar modo ECB (usar CBC, GCM en su lugar)

Al Usar Claves Asimetricas (RSA)

  • Usar minimo claves de 2048bit
  • Nunca exponer claves privadas
  • Usar relleno OAEP (evitar PKCS#1 v1.5)
  • Establecer politica de rotacion de claves

Preguntas Frecuentes

P: Debo cifrar las claves API para almacenarlas?

R: Usa variables de entorno o herramientas de gestion de secretos (AWS Secrets Manager, HashiCorp Vault) en lugar de cifrado. Incluso con cifrado, aun tienes el problema de gestionar la clave de descifrado.

P: Es seguro cifrar en el lado del cliente?

R: No. El codigo del cliente es visible para todos, exponiendo la clave. El cifrado sensible debe hacerse en el servidor.

P: SHA-256 es cifrado?

R: No. SHA-256 es hashing. No puede descifrarse. Si necesitas recuperar datos, usa cifrado como AES.


Resumen

EscenarioAlgoritmo
Cifrado de grandes datosAES-256
Intercambio de clavesRSA, ECDH
Firmas digitalesRSA, ECDSA, Ed25519
Almacenamiento de contrasenasbcrypt, Argon2 (hashing)
Comunicacion HTTPSHibrido (RSA + AES)

Herramientas Relacionadas

HerramientaProposito
Cifrado/DescifradoCifrado AES
Generador de Claves RSAGeneracion de pares RSA
Generador de HashHashing SHA, MD5
cifradoAESRSAHTTPSseguridaddesarrollo

Sobre el Autor

Toolypet Team

Toolypet Team

Development Team

The Toolypet Team creates free, privacy-focused web tools for developers and designers. All tools run entirely in your browser with no data sent to servers.

Web DevelopmentCSS ToolsDeveloper ToolsSEOSecurity