Roban la base de datos de clientes
A una web de entradas para conciertos le roban la base de datos. Dentro hay 150.000 correos con sus contraseñas.
Mucha gente usa la misma contraseña para su correo y su banco. Si las contraseñas se pueden leer, el atacante entra en todas partes.
Un sistema bien hecho nunca guarda la contraseña. Vamos a ver qué guarda en su lugar.
Al final de esta lección
Nota
Puedo explicar por qué las contraseñas se guardan como hash.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Texto plano | texto que cualquiera puede leer tal cual | |
| Función hash | cálculo que convierte un texto en un código de longitud fija | SHA-256 |
| Hash | el código que sale, imposible de invertir | |
| Sal | texto aleatorio que se añade antes del hash | |
| Brecha de datos | datos que acaban en manos de quien no debe |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un hash funciona en un solo sentido
Una función hash convierte cualquier texto en un código de longitud fija. Ese código es el hash.
El mismo texto da siempre el mismo hash. Si cambias una sola letra, el hash cambia por completo.
Desde el hash no se puede volver al texto. Por eso se puede guardar sin peligro.
Prueba: hacer el hash de una contraseña
import hashlib
def make_hash(text):
# encode() pasa el texto a bytes, que es lo que pide hashlib
return hashlib.sha256(text.encode()).hexdigest()
print(make_hash("Valencia2026"))
print(make_hash("Valencia2026"))
print(make_hash("valencia2026"))
print(len(make_hash("a")), len(make_hash("una contraseña mucho más larga")))
# Cambia una letra de "Valencia2026" y vuelve a ejecutar.
Los nombres del código van en inglés
Consejo
Verás nombres como make_hash o password. En casi todas las empresas el código se escribe con nombres en inglés. Así lo entiende cualquier compañero. Los comentarios y los mensajes siguen en español.
Iniciar sesión es comparar dos hashes
Al darte de alta, el sistema calcula el hash de tu contraseña. Solo guarda ese hash.
Al iniciar sesión, calcula el hash de lo que escribes. Luego lo compara con el hash guardado. Si son iguales, entras.
El sistema nunca necesita conocer tu contraseña. Quien robe la base solo se lleva hashes.
La sal separa dos contraseñas iguales
Dos personas con la misma contraseña tienen el mismo hash. Un atacante lo ve enseguida. También puede buscar hashes de contraseñas comunes en listas enormes ya preparadas.
La sal lo evita. El sistema añade un texto aleatorio a cada contraseña antes de calcular el hash. La sal se guarda junto al hash. No tiene que ser secreta.
Prueba: añadir una sal
import hashlib
def make_hash(text):
return hashlib.sha256(text.encode()).hexdigest()
# Dos empleadas eligen la misma contraseña
print("Lucía:", make_hash("Valencia2026")[:16])
print("Marta:", make_hash("Valencia2026")[:16])
# Cada una recibe su propia sal, guardada junto al hash
print("Lucía:", make_hash("r8Tm" + "Valencia2026")[:16])
print("Marta:", make_hash("q3Zw" + "Valencia2026")[:16])
# Dale a Marta la sal "r8Tm". ¿Qué pasa con su hash?
Un error frecuente
Advertencia
Mucha gente cree que hacer un hash y cifrar son lo mismo. Un dato cifrado se descifra con una clave. Un hash no se deshace, ni siquiera con una clave. Guarda las contraseñas como hash, porque nadie, ni tú, debe poder leerlas.
En un puesto real
Consejo
SHA-256 es rápido, y eso ayuda a quien prueba miles de millones de contraseñas. Los sistemas reales usan un hash lento como bcrypt o Argon2, que ya añade la sal. La idea es la misma de esta lección.