¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Guardar contraseñas y proteger sesiones

Después de esta lección: Puedo guardar una contraseña como hash con sal y decidir si una sesión sigue siendo válida.

Lección de 60 min3 comandosLaboratorio de inyección SQL: ataca una búsqueda débil, corrige la consulta y demuéstralo

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

PalabraQué significaEjemplo
Hashhuella de un texto que no se puede deshacersha256
Saltexto aleatorio añadido antes de calcular el hash
Sesiónel tiempo en que el servidor recuerda quién eres
Token de sesióncódigo largo que identifica una sesión
Caducidadmomento 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 guardarSe ve en la baseSi la base se roba
Texto planoclaveEl ladrón lee la clave
Hash sin salUna huella igual para todos los que usan claveSe descubren todas las repetidas de golpe
Hash con salUna huella distinta para cada usuarioHay 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

Código: python
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

Comando
printf 'clave' | sha256sum

Se 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

Comando
printf 'sal1clave' | sha256sum

Se 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

Comando
docker exec app grep -c "password" /tmp/app/app.py

Se 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

ReglaValor del ejemploQué evita
Token largo y aleatorio32 caracteres como mínimoQue alguien lo adivine
Caducidad por inactividad30 minutos sin usoQue sirva un ordenador olvidado
Caducidad total8 horas desde el inicioQue una sesión robada dure para siempre
Cierre de sesiónEl servidor la borraQue 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.

Sobre este laboratorio y su código: Laboratorio de inyección SQL: ataca una búsqueda débil, corrige la consulta y demuéstralo

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.