Passkeys, ¿adiós a los passwords?
06-04-2023
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
- 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
- Solicitamos al servidor un "challenge". Este challenge es un token aleatorio que debemos firmar en el siguiente paso.

- 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.

- Por último comprobamos la respuesta del servidor para saber si todo ha ido bien.

Autenticación
El proceso de autenticación es similar:
-
Partimos desde el mismo formulario del caso anterior donde el usuario introduce su email.
-
Solicitamos un nuevo "challenge" al servidor.

- Firmamos el challenge con nuestra clave privada haciendo uso de la API de WebAuthn y lo enviamos al servidor.

- El servidor intenta verificar el challenge firmado usando la clave pública del usuario que tiene almacenada en la base de datos.

- 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.