Una contraseña se guarda como hash con sal
Guardar una contraseña de forma segura es guardar solo su hash con sal, nunca la contraseña. Si alguien roba la base de datos, no encuentra las claves reales.
Piensa en el campus virtual de una universidad. Una brecha en su base no debería dejar entrar en las cuentas de miles de estudiantes.
Al final de esta lección
Nota
Puedo guardar una contraseña como hash con sal y decidir si una sesión sigue siendo válida.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Hash | huella de un texto que no se puede deshacer | sha256 |
| Sal | texto aleatorio añadido antes de calcular el hash | |
| Sesión | el tiempo en que el servidor recuerda quién eres | |
| Token de sesión | código largo que identifica una sesión | |
| Caducidad | momento en que una sesión deja de valer |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un hash no se puede deshacer
Un hash convierte un texto en otro de largo fijo. El mismo texto da siempre el mismo hash. Un cambio mínimo da un hash totalmente distinto. Y del hash no se recupera el texto.
Para comprobar una contraseña, el servidor calcula el hash de lo que escribes y lo compara con el guardado.
Ejemplo resuelto: lo que guarda la base
| Forma de guardar | Se ve en la base | Si la base se roba |
|---|---|---|
| Texto plano | clave | El ladrón lee la clave |
| Hash sin sal | Una huella igual para todos los que usan clave | Se descubren todas las repetidas de golpe |
| Hash con sal | Una huella distinta para cada usuario | Hay que atacar las cuentas una a una |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Calcular un hash con sal
import hashlib
# Cambia la sal y pulsa Run. La misma clave da otro hash.
salt = "sal1"
password = "clave"
print(hashlib.sha256((salt + password).encode()).hexdigest())
Mira dos hashes y la tienda
Ejecuta estos tres comandos en la terminal de tu laboratorio. Solo miran. Los dos primeros calculan el hash de dos textos. El tercero cuenta cuántas líneas del programa de la tienda nombran la palabra password. No muestra ninguna contraseña.
La regla única
Advertencia
Ataca solo tu copia privada del laboratorio, que no tiene salida a internet. Probar un sistema ajeno, o sin permiso, es delito en casi todos los países.
El hash de la palabra clave
printf 'clave' | sha256sumSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
El hash de la misma palabra con sal
printf 'sal1clave' | sha256sumSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Líneas de la tienda que nombran password
docker exec app grep -c "password" /tmp/app/app.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Qué te dicen las tres respuestas
El primero imprime una huella de 64 caracteres que empieza por 6d5074b4. El segundo imprime otra totalmente distinta, que empieza por 1df4c921, aunque solo se añadió una sal.
El tercero imprime 2: la tienda declara una columna de contraseñas y las inserta. Pregúntate en qué forma las guarda.
Una sesión necesita token y caducidad
Tras iniciar sesión, el servidor da al navegador un token de sesión. En cada visita el navegador lo devuelve y el servidor sabe quién es.
El token debe ser largo y aleatorio. Y debe caducar: tras un tiempo sin uso, y tras un máximo total aunque se siga usando.
Ejemplo resuelto: reglas de una sesión
| Regla | Valor del ejemplo | Qué evita |
|---|---|---|
| Token largo y aleatorio | 32 caracteres como mínimo | Que alguien lo adivine |
| Caducidad por inactividad | 30 minutos sin uso | Que sirva un ordenador olvidado |
| Caducidad total | 8 horas desde el inicio | Que una sesión robada dure para siempre |
| Cierre de sesión | El servidor la borra | Que el token siga valiendo |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que cifrar las contraseñas es lo mismo que hacer su hash. No es así. Lo que se cifra se puede descifrar con la clave. Un hash no tiene vuelta atrás, y por eso es lo que se guarda.