Tecnología que te entiende
Criptografía: simétrica, asimétrica y hashing explicados
Ciberseguridad

Criptografía: simétrica, asimétrica y hashing explicados

22 Mar 2026 3 min de lectura 961 vistas

Cada vez que entras a tu banco, envías un email o descargas una app, la criptografía trabaja en silencio para protegerte. Entender sus fundamentos — cifrado simétrico, asimétrico y hashing — es esencial para cualquier profesional de sistemas.

¿Qué es la criptografía?

La criptografía es la ciencia de transformar información legible (texto plano) en información ilegible (texto cifrado) para que solo quien tenga la clave pueda acceder a ella. En seguridad informática se usa para garantizar confidencialidad, integridad y autenticación.

Cifrado Simétrico

Usa la misma clave para cifrar y descifrar. Es muy rápido pero tiene un problema: ¿cómo compartes la clave de forma segura?

from cryptography.fernet import Fernet

# Generar clave simétrica
clave = Fernet.generate_key()
f = Fernet(clave)

# Cifrar
mensaje = b"Datos confidenciales del servidor"
cifrado = f.encrypt(mensaje)
print(cifrado)  # b'gAAAAAB...' (ilegible)

# Descifrar
original = f.decrypt(cifrado)
print(original)  # b'Datos confidenciales del servidor'

Algoritmos más usados:

  • AES (Advanced Encryption Standard) — el estándar actual. AES-256 se considera irrompible con tecnología actual
  • ChaCha20 — alternativa moderna a AES, más rápida en dispositivos sin hardware AES
  • 3DES — obsoleto, evitar en nuevos sistemas
⚠️ DES está muerto: El algoritmo DES con clave de 56 bits puede romperse en menos de 24 horas con hardware moderno. Si lo ves en un sistema, es una vulnerabilidad.

Cifrado Asimétrico

Usa un par de claves: clave pública (para cifrar, se comparte con todos) y clave privada (para descifrar, nunca sale de tu control). Resuelve el problema de intercambio de claves pero es mucho más lento que el simétrico.

from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes

# Generar par de claves RSA-2048
clave_privada = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048
)
clave_publica = clave_privada.public_key()

# Cifrar con clave pública (cualquiera puede hacerlo)
mensaje = b"Mensaje secreto"
cifrado = clave_publica.encrypt(
    mensaje,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# Solo el dueño de la clave privada puede descifrar
original = clave_privada.decrypt(cifrado, padding.OAEP(
    mgf=padding.MGF1(algorithm=hashes.SHA256()),
    algorithm=hashes.SHA256(),
    label=None
))

Algoritmos más usados: RSA (2048 o 4096 bits), ECC (Elliptic Curve — más eficiente), Ed25519 (para SSH moderno).

Criptografía híbrida: lo mejor de ambos mundos

TLS (HTTPS) usa criptografía híbrida: asimétrica para intercambiar de forma segura una clave simétrica temporal (session key), luego simétrica para el resto de la comunicación. Así tiene la seguridad del asimétrico con la velocidad del simétrico.

Hashing: huellas digitales de datos

Un hash es una función unidireccional que convierte cualquier dato en una cadena de longitud fija. No es cifrado — no se puede revertir. Se usa para verificar integridad y almacenar contraseñas.

import hashlib

datos = b"El contenido de este archivo"

# SHA-256 (el más usado hoy)
hash_sha256 = hashlib.sha256(datos).hexdigest()
print(hash_sha256)
# e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

# Verificar integridad: si un solo bit cambia, el hash cambia completamente
datos_modificados = b"El contenido de este Archivo"  # "A" mayúscula
print(hashlib.sha256(datos_modificados).hexdigest())
# Resultado completamente diferente

Para contraseñas — usa bcrypt o Argon2, nunca SHA directo:

import bcrypt

password = b"mi_contrasena_123"

# Generar hash con salt automático
hashed = bcrypt.hashpw(password, bcrypt.gensalt(rounds=12))

# Verificar
if bcrypt.checkpw(password, hashed):
    print("Contraseña correcta")  # nunca comparar el hash directamente
✅ Regla de oro: SHA-256 para integridad de archivos. bcrypt o Argon2 para contraseñas. AES-256 para cifrado simétrico. RSA-4096 o Ed25519 para asimétrico. Nunca MD5 o SHA-1 para seguridad — están comprometidos.
"La criptografía no es magia — es matemática. Y como toda matemática, la seguridad depende de implementarla correctamente, no solo de elegir el algoritmo correcto."