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
| Algoritmo | Longitud de clave | Caracteristicas |
|---|---|---|
| AES | 128/192/256 bits | Estandar actual, rapido |
| ChaCha20 | 256 bits | Para moviles, rapido |
| 3DES | 168 bits | Legado, 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
| Ventajas | Desventajas |
|---|---|
| Rapido | La distribucion de claves es un desafio |
| Adecuado para cifrar grandes volumenes de datos | Se 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
| Algoritmo | Uso | Caracteristicas |
|---|---|---|
| RSA | Cifrado, firma | Ampliamente utilizado |
| ECDSA | Firma | Alta seguridad con claves cortas |
| Ed25519 | Firma | Rapido, moderno |
| X25519 | Intercambio de claves | Diffie-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
| Ventajas | Desventajas |
|---|---|
| Distribucion de claves segura | Mas lento que el cifrado simetrico |
| Util para autenticacion y firmas | No 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
| Algoritmo | Longitud de salida | Uso |
|---|---|---|
| SHA-256 | 256 bits | Hash de proposito general |
| SHA-3 | Variable | Estandar de nueva generacion |
| bcrypt | Variable | Hash de contrasenas |
| Argon2 | Variable | Hash 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
| Uso | Metodo Recomendado |
|---|---|
| Cifrado de comunicaciones (HTTPS) | TLS (cifrado hibrido) |
| Cifrado de archivos | AES-256-GCM |
| Almacenamiento de contrasenas | Argon2, bcrypt |
| Deteccion de manipulacion de datos | HMAC-SHA256 |
| Firma digital | Ed25519, ECDSA |
| Generacion de claves API | CSPRNG + 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