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
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
"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."