Fundamentos de Cifrado - Tecnologias Criptograficas para Proteger Datos

14 min de lectura | 2025.12.06

Que es el Cifrado

El cifrado es una tecnologia que transforma datos en un formato que terceros no pueden leer. Solo quienes poseen la clave correcta pueden restaurar (descifrar) los datos originales.

Por que es necesario: Para hacer frente a los riesgos de que los datos caigan en manos de terceros, como la interceptacion de comunicaciones, el acceso no autorizado a bases de datos o la perdida de dispositivos.

Tipos de Cifrado

flowchart LR
    subgraph Crypto["Tecnologias de Cifrado"]
        subgraph Symmetric["Cifrado Simetrico"]
            S1["Misma clave para cifrar/descifrar"]
        end

        subgraph Asymmetric["Cifrado Asimetrico"]
            A1["Claves diferentes para cifrar/descifrar"]
        end

        subgraph Hash["Funciones Hash (Funciones Unidireccionales)"]
            H1["No se puede descifrar, solo verificar"]
        end
    end

Cifrado Simetrico

Utiliza la misma clave tanto para cifrar como para descifrar.

flowchart LR
    P1["Texto plano"] --> E["Cifrado"]
    K1["Clave compartida"] --> E
    E --> C["Texto cifrado"]
    C --> D["Descifrado"]
    K2["Clave compartida (la misma)"] --> D
    D --> P2["Texto plano"]

Algoritmos Representativos

AlgoritmoLongitud de claveCaracteristicas
AES128/192/256 bitsEstandar actual, rapido
ChaCha20256 bitsPara moviles, rapido
3DES168 bitsLegado, no recomendado

Ejemplo de Implementacion

const crypto = require('crypto');

// Cifrado
function encrypt(text, key) {
  const iv = crypto.randomBytes(16);
  const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
  let encrypted = cipher.update(text, 'utf8', 'hex');
  encrypted += cipher.final('hex');
  const authTag = cipher.getAuthTag();
  return {
    iv: iv.toString('hex'),
    encrypted,
    authTag: authTag.toString('hex')
  };
}

// Descifrado
function decrypt(encryptedData, key) {
  const decipher = crypto.createDecipheriv(
    'aes-256-gcm',
    key,
    Buffer.from(encryptedData.iv, 'hex')
  );
  decipher.setAuthTag(Buffer.from(encryptedData.authTag, 'hex'));
  let decrypted = decipher.update(encryptedData.encrypted, 'hex', 'utf8');
  decrypted += decipher.final('utf8');
  return decrypted;
}

Ventajas y Desventajas

VentajasDesventajas
RapidoLa distribucion de claves es un desafio
Adecuado para cifrar grandes volumenes de datosSe necesita una clave por cada interlocutor

Cifrado Asimetrico

Utiliza claves diferentes (clave publica y clave privada) para cifrar y descifrar.

sequenceDiagram
    participant S as Emisor
    participant R as Receptor

    Note over R: Clave privada (solo el receptor)<br/>Clave publica (publica)

    R->>S: Enviar clave publica
    S->>S: Cifrar texto plano con clave publica
    S->>R: Enviar texto cifrado
    R->>R: Descifrar con clave privada → Texto plano

Algoritmos Representativos

AlgoritmoUsoCaracteristicas
RSACifrado, firmaAmpliamente utilizado
ECDSAFirmaAlta seguridad con claves cortas
Ed25519FirmaRapido, moderno
X25519Intercambio de clavesDiffie-Hellman con curvas elipticas

Firma Digital

Se firma con la clave privada y se verifica con la clave publica.

sequenceDiagram
    participant S as Emisor (Firma)
    participant R as Receptor (Verificacion)

    S->>S: Firmar datos con clave privada
    S->>R: Enviar datos + firma
    R->>R: Verificar con clave publica → Autentico/Falso

Ventajas y Desventajas

VentajasDesventajas
Distribucion de claves seguraMas lento que el cifrado simetrico
Util para autenticacion y firmasNo adecuado para grandes volumenes de datos

Cifrado Hibrido

En los sistemas reales, se combinan ambos metodos.

sequenceDiagram
    participant S as Emisor
    participant R as Receptor

    S->>S: 1. Generar clave compartida aleatoria
    S->>S: 2. Cifrar datos con clave compartida (rapido)
    S->>S: 3. Cifrar clave compartida con clave publica del receptor
    S->>R: 4. Enviar datos cifrados + clave compartida cifrada
    R->>R: 5. Descifrar clave compartida con clave privada
    R->>R: 6. Descifrar datos con clave compartida

Funciones Hash

Generan un valor hash de longitud fija a partir de datos de cualquier longitud. No es posible restaurar los datos originales.

flowchart LR
    A["'Hello'"] --> H1["SHA-256"] --> R1["185f8db32271fe25..."]
    B["'Hello!'"] --> H2["SHA-256"] --> R2["334d016f755cd6dc..."]

    Note["Con solo un caracter diferente<br/>el hash es completamente distinto"]

Algoritmos Representativos

AlgoritmoLongitud de salidaUso
SHA-256256 bitsHash de proposito general
SHA-3VariableEstandar de nueva generacion
bcryptVariableHash de contrasenas
Argon2VariableHash de contrasenas (recomendado)

Hash de Contrasenas

const bcrypt = require('bcrypt');

// Hash de contrasena
async function hashPassword(password) {
  const saltRounds = 12;
  return await bcrypt.hash(password, saltRounds);
}

// Verificacion de contrasena
async function verifyPassword(password, hash) {
  return await bcrypt.compare(password, hash);
}

// Ejemplo de uso
const hash = await hashPassword('mypassword123');
// → "$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8..."

const isValid = await verifyPassword('mypassword123', hash);
// → true

Las contrasenas siempre deben almacenarse con hash: Nunca almacenar en texto plano. Usar funciones hash con salt (bcrypt, Argon2).

Seleccion segun el Uso

UsoMetodo Recomendado
Cifrado de comunicaciones (HTTPS)TLS (cifrado hibrido)
Cifrado de archivosAES-256-GCM
Almacenamiento de contrasenasArgon2, bcrypt
Deteccion de manipulacion de datosHMAC-SHA256
Firma digitalEd25519, ECDSA
Generacion de claves APICSPRNG + Base64

Resumen

El cifrado es una tecnologia fundamental para la seguridad de datos. El cifrado simetrico es rapido y adecuado para cifrar grandes volumenes de datos, mientras que el cifrado asimetrico es adecuado para la distribucion de claves y la autenticacion. En los sistemas reales, se utiliza cifrado hibrido que combina ambos. Para el almacenamiento de contrasenas, siempre use funciones hash con salt.

← Volver a la lista