leanmind logo leanmind text logo

Blog

BDD

Behaviour-driven Development es una técnica para tomar mejores requisitos de producto.

Passkeys, ¿adiós a los passwords?

Por José Luis Rodríguez Alonso

Passwords. Son un problema de seguridad constante. Son fáciles de olvidar. Es fácil caer en un ataque de phishing y acabar entregándola a quien no debes. Nuestros sistemas son más vulnerables si tenemos que almacenarlas en nuestra base de datos… y así una larga lista de problemas.

Los passkeys son una iniciativa de varias empresas grandes del sector basada en un estándar abierto, Web Authentication, que nace con la idea de solucionar esos problemas.

¿Cómo funciona?

Que una tecnología sea nueva no quiere decir que esté basada en algo moderno. En este caso, el núcleo de los passkeys está en la criptografía de clave pública que lleva utilizándose desde los años 70. Para cada web en la que te registras se crea un nuevo conjunto de clave pública y privada, la privada se queda siempre en tu sistema, la pública se envía al servidor para ser utilizada luego en el proceso de autenticación. La misma idea detrás del SSH y HTTPS que todos utilizamos.

Para simplificar este proceso y acercarlo al común de los mortales, el navegador se apoya en cualquier dispositivo con identificación biométrica que tengas disponible. Será ese dispositivo el que cree y almacene la clave privada y utilice tu cara o tu huella dactilar para confirmar que realmente eres tú.

Si el ordenador en el que te encuentras no tiene lector de huellas o algo como Windows Hello, el navegador te mostrará un código QR que puedes escanear con el móvil y completar la autenticación o registro desde ahí.

Por seguridad, el dispositivo debe estar cerca del navegador, en el radio de alcance del bluetooth.

Al contrario que los passwords, que se basan únicamente en algo que sabes, los passkeys se consideran 2FA porque necesitas autenticarte con dos factores: algo que eres (tu huella dactilar o tu cara) y algo que tienes (el dispositivo donde se almacena la clave privada).

Lo bueno

Este tipo de autenticación y registro tiene varias ventajas interesantes. La más importante es el hecho de no tener que enviar y almacenar passwords. Cada web en la que te registras tendrá su propio set de claves y será el sistema el que se encargue de confirmar que la web a la que quieres entrar es realmente quien dice ser. Estos dos puntos nos libran de los ataques de phishing y de posibles leaks de contraseñas.

La experiencia de uso también promete ser más amigable que la actual autenticación en dos pasos. Un click, dedo al lector de huellas y ya estás dentro.

Lo menos bueno

A día de hoy los passkeys no están muy extendidos. Hay demasiados usuarios usando sistemas que aún no soportan este tipo de autenticación, por lo que por ahora no se puede basar la autenticación y registro exclusivamente en esta tecnología. En un proyecto real debes mantener métodos de autenticación alternativos como el SSO con terceros, lo cual añade una capa más de complejidad a tu aplicación.

¡Queremos ver el código!

Al menos en la versión actual, el uso sin librerías de terceros se hace un poco engorroso, demasiado código para incluirlo en este artículo. Para una implementación real sería interesante buscar alguna librería open source que nos simplifique la vida.

A continuación trataré de explicar los distintos pasos que debemos seguir para un registro y login sencillo utilizando WebAuthn / Passkeys.

Registro de una nueva cuenta

  1. Mostramos un campo de texto para introducir el email del usuario. Debemos indicar al navegador que el campo es auto-completable con webauthn: <input type="email" autocomplete="username webauthn">

Indicando username webauthn estaríamos dando soporte a los dos tipos de autenticación: passwords y passkeys

  1. Solicitamos al servidor un “challenge”. Este challenge es un token aleatorio que debemos firmar en el siguiente paso.
Paso 1: El navegador indica que quiere registrarse y el servidor solicita una clave pública
  1. Creamos un nuevo conjunto de claves para esta web utilizando la API de WebAuthn. En este paso se firma el “challenge” recibido en el paso anterior. Una vez firmado se envía de nuevo al servidor junto a la clave pública para que se almacene en la base de datos.
Paso 2: El navegador envía la clave pública al servidor
  1. Por último comprobamos la respuesta del servidor para saber si todo ha ido bien.
Paso 3: El servidor indica que el proceso ha finalizao con éxito

Autenticación

El proceso de autenticación es similar:

  1. Partimos desde el mismo formulario del caso anterior donde el usuario introduce su email.

  2. Solicitamos un nuevo “challenge” al servidor.

Paso 1: El navegador indica que quiere autenticarse y el servidor solicita la firma de un token
  1. Firmamos el challenge con nuestra clave privada haciendo uso de la API de WebAuthn y lo enviamos al servidor.
Paso 2: El navegador envía al servidor el token firmado
  1. El servidor intenta verificar el challenge firmado usando la clave pública del usuario que tiene almacenada en la base de datos.
Paso 3: El servidor indica que el proceso de autenticación ha finalizado con éxito
  1. Si el challenge coincide con el esperado significa que el usuario es quien dice ser y lo podemos dar por autenticado.

Conclusiones

Como ves arriba, es necesario jugar al ping-pong con el servidor para validar a un usuario cuando usamos passkeys. Esto lo convierte en algo un poco más complejo de desarrollar que los passwords de toda la vida. También lo convierten en algo mucho más seguro, que es lo que realmente importa en este caso.

Que empresas como Paypal estén añadiendo soporte a los passkeys hace soñar con un futuro sin passwords. Crucemos los dedos.

Publicado el 06/04/2023 por
José Luis image

José Luis Rodríguez Alonso

¿Quieres más? te invitamos a suscribirte a nuestro boletín para avisarte cada vez que recopilemos contenido de calidad que compartir.

Si disfrutas leyendo nuestro blog, ¿imaginas lo divertido que sería trabajar con nosotros? ¿te gustaría?

Impulsamos el crecimiento profesional de tu equipo de developers