SkillGridAprende informática practicando

Autenticacion: contrasenas, factores y tokens

Almacenamiento de contrasenas que sobrevive a un volcado de la base, por que TOTP no es SMS, lo que realmente cuesta un JWT y por que OAuth es delegacion y no inicio de sesion.

15 min · 50 XP

Ya sabes la diferencia entre hash y cifrado: un hash no se puede devolver a su entrada, el cifrado si. Esa es toda la razon por la que un sitio guarda un hash de tu contrasena y no la contrasena. Lo que aquella leccion no cubria es la parte que decide si el hash guardado protege a alguien en la practica. De eso va esta leccion, y de todo lo que ocurre alrededor del campo de contrasena. Todo lo anterior supone que el atacante esta fuera. La parte incomoda de esta leccion es que la forma mas comun de entrar es una cuenta valida usada por quien no deberia, o una contrasena valida escrita en una pagina que no era la real. Por eso los controles que parecen poco lucidos, como un gestor de contrasenas, un segundo factor y una sesion corta, hacen en la practica mas trabajo que cualquier diseno criptografico ingenioso.

SHA-256 es la herramienta equivocada para contrasenas, y no porque sea debil. Aqui es debil porque es rapido. Una tarjeta grafica moderna prueba del orden de 10^11 hashes SHA-256 por segundo, asi que cualquier contrasena posible de ocho caracteres cae en segundos. Un hash de contrasena necesita la propiedad contraria: debe ser lento a proposito, y lento de una forma que no se pueda comprar con mas hardware. Eso es lo que hacen scrypt y argon2id. Los parametros de coste no son adorno: son toda la defensa, y hay que subirlos a medida que el hardware se acelera.

GPU, single card, offline guessing against a leaked dump

algorithm        cost setting        guesses/sec     one 8-char password
---------------  -----------------  --------------  ---------------------
SHA-256          plain               10^11           seconds
MD5              plain               10^11           seconds
bcrypt           cost 12             10^3            ~ 30 years
scrypt           N=2^15, r=8, p=1  10^2            ~ 300 years
argon2id         m=64 MiB, t=3       10^1            ~ 3000 yearsOrdenes de magnitud aproximados para el ataque sin conexion sobre un volcado filtrado con una GPU moderna. Toma los numeros como forma, no como dogma: las tasas exactas cambian cada ano, las distancias entre filas no.
UserAppDatabaseusername and passwordsalt = random 16 bytesstored = scrypt(password, salt, N=2^15)save username, salt, storedsalt is stored next to the hash, so it is not a secretsame password againread salt and stored valuerecompute with the same salt and compareone guess still costs the attacker 100 ms

La autenticacion multifactor significa demostrar dos cosas de naturaleza distinta: algo que sabes, algo que tienes o algo que eres. Contrasena mas pregunta secreta son un solo factor preguntado dos veces. En la practica importa una pregunta mas estrecha que cuantos factores tengas: puede un atacante que esta hablando contigo ahora mismo reenviar tu segundo factor al sitio real antes de que caduque? Los codigos se pueden reenviar. Las claves no. La distincion practica no es la fortaleza abstracta, sino si existe un secreto de vida corta que el atacante pueda pasar de largo.

Una vez dentro, el servidor necesita recordarlo. Puede guardar un token opaco aleatorio y buscarlo en cada peticion, o puede entregarte un bloque firmado de afirmaciones y comprobar la firma en lugar de consultar una base de datos. Lo segundo es un JWT, y es popular por una razon real: cualquier servidor de la flota puede verificarlo sin hablar con un almacen compartido. El precio se cuenta menos. Un JWT es valido hasta que caduca, porque lo unico que el servidor puede hacer es comprobar una firma, y una firma no sabe que pulsaste salir. Revocarlo antes significa mantener una lista de revocados, que es justo el estado del que intentabas escapar. El compromiso en una tabla. Un JWT no es un mejor token de sesion; es un token de sesion que compro la ausencia de estado pagando con la revocabilidad. Recordarme no es una casilla de comodidad, es una decision de caducidad tomada en nombre del usuario. Un token de vida larga que sobrevive al cierre del navegador son credenciales en un dispositivo que no controlas, y hay que tratarlas como tal: ligadas a un dispositivo, revocables desde la pagina de la cuenta e invalidadas cuando cambia la contrasena. La version honesta de la funcion mantiene la sesion larga y vuelve a pedir la contrasena antes de cualquier accion destructiva. La version deshonesta mantiene un token permanente que solo mata un restablecimiento de contrasena, y nadie recuerda que existe hasta que se vende un portatil. OAuth responde a una pregunta que no tiene nada que ver con quien eres: como dejo que un servicio actue en otro servicio en mi nombre sin darle mi contrasena? Envias al usuario al proveedor, el proveedor le pide aprobar un conjunto concreto de permisos y devuelve un codigo que solo la aplicacion solicitante puede canjear por un token. El token lleva un alcance y una caducidad. Lo que OAuth deliberadamente no define es como demostrar identidad, y por eso existe OpenID Connect como capa fina de identidad encima. La consecuencia merece recordarse: un servicio que te deja entrar con un token OAuth en crudo y nada mas esta tomando una decision de autenticacion a partir de un mecanismo de autorizacion.

Práctica

  1. Se filtra una base de datos de hashes de contrasenas. Cada valor guardado es scrypt(contrasena, salt) con parametros que cuestan unos 100 ms por calculo. Que afirmacion es cierta?

    Pistas
    • El atacante ya tiene los valores guardados. El salt esta justo al lado, asi que no puede ser un secreto.
    • Lo que hace caro de atacar un hash de contrasena no es el secreto, sino el coste deliberado de cada intento.
  2. Relaciona cada mecanismo con lo que realmente aporta.

    Pistas
    • Para cada formato de token hazte una pregunta: despues de entregarlo, puede el servidor recuperarlo antes de que caduque?
    • Para cada segundo factor hazte otra pregunta: existe un valor de vida corta que el atacante pueda reenviar al sitio real mientras sigue siendo valido?
  3. Ordena el flujo del codigo de autorizacion de OAuth.

    1. 1el proveedor devuelve un token de acceso con el alcance aprobado y una caducidad
    2. 2la aplicacion canjea el codigo presentando su secreto de cliente, y el codigo es de un solo uso
    3. 3el proveedor autentica al usuario y muestra que se esta solicitando
    4. 4la aplicacion llama a la API con ese token, y la contrasena del usuario nunca estuvo implicada
    5. 5el usuario aprueba, y el proveedor devuelve un codigo de autorizacion de vida corta
    6. 6la aplicacion envia al usuario al proveedor con un client_id y un alcance solicitado
    Pistas
    • No se puede emitir nada antes de que el servicio decida quien pregunta y si el usuario acepto.
    • El secreto de cliente se usa una vez, en el momento en que la aplicacion cambia el codigo de vida corta por un token, y el token va al final.

Preguntas sobre esta lección

¿Es gratis?

Sí. El primer nivel de cada materia es gratis y no necesita cuenta. Los niveles más profundos y los grados superiores son de pago: eso es lo que mantiene vivo el proyecto.

¿Para qué edad es?

Está escrito para adolescentes curiosos a partir de unos 12 años y para adultos que empiezan de cero. No se supone experiencia previa en programación; las lecciones de redes y física no necesitan matemáticas más allá del colegio.

¿Necesito saber programar ya?

No. Las rutas de lógica, física y redes empiezan desde cero. El código lo escribes en la sección de lenguajes, que también arranca desde el principio.

¿Hay que instalar algo?

No. Todo funciona en el navegador: teoría, práctica y las simulaciones interactivas. No hay nada que descargar ni que configurar.

¿Cuánto se tarda en una materia?

Una lección dura entre 10 y 15 minutos. Un grado junior son unas 12 a 20 lecciones, así que son unas semanas de práctica constante, no una tarde.

¿Hay que seguir el orden?

Dentro de un grado los niveles se abren uno tras otro, porque cada uno se apoya en el anterior. Entre materias eres libre: empieza por lógica, física o redes.