# WebAuthn / Passkeys

> WebAuthn y Passkeys — autenticación reforzada sin contraseña

Estándar W3C / FIDO2 de autenticación reforzada mediante criptografía asimétrica, que permite iniciar sesión por biometría o llave física sin contraseña. Las passkeys son la evolución sincronizada multidispositivo, ya estándar en iOS, Android y Windows.

_Categoría: securite_

---

## Definición

**WebAuthn** (_Web Authentication_) es un estándar W3C (2019), codesarrollado con la FIDO Alliance bajo el nombre de FIDO2, que permite a un sitio solicitar una autenticación reforzada mediante criptografía asimétrica.

El usuario prueba su identidad a través de un authenticator (una llave física, Touch ID, Windows Hello, Face ID), sin introducir nunca una contraseña. Las **passkeys** son su evolución (2022+): credenciales WebAuthn sincronizadas entre dispositivos a través de la nube del fabricante (iCloud Keychain, Google Password Manager) o entre dispositivos mediante código QR — convertidas en el nuevo estándar de autenticación del gran público.

## Cómo funciona

En el registro, el authenticator genera un par de claves propio del sitio: la clave privada nunca sale del secure element, y la clave pública la almacena el sitio. En el inicio de sesión, el sitio envía un desafío (challenge) que el authenticator firma con la clave privada (tras el desbloqueo biométrico), y el sitio verifica la firma.

```mermaid
sequenceDiagram
    autonumber
    participant Browser as Navegador
    participant RP as Sitio (Relying Party)
    participant Auth as Authenticator<br/>(Touch ID / llave)

    Note over Browser,Auth: REGISTRO
    Browser->>RP: 1. Inicia el alta
    RP-->>Browser: 2. Challenge + info del RP
    Browser->>Auth: 3. navigator.credentials.create()
    Auth->>Auth: 4. Solicita biometría
    Auth->>Auth: 5. Genera par de claves
    Auth-->>Browser: 6. Clave pública + attestation
    Browser->>RP: 7. Almacena la clave pública

    Note over Browser,Auth: INICIO DE SESIÓN
    Browser->>RP: 8. Quiere iniciar sesión
    RP-->>Browser: 9. Challenge
    Browser->>Auth: 10. navigator.credentials.get()
    Auth->>Auth: 11. Solicita biometría
    Auth->>Auth: 12. Firma el challenge con la clave privada
    Auth-->>Browser: 13. Firma
    Browser->>RP: 14. Verificación
    RP-->>Browser: 15. Sesión abierta
```

La credencial está vinculada al dominio (_origin binding_): un falso `examp1e.com` no tiene la clave, lo que hace imposible el phishing.

## Las 3 propiedades clave

- **A prueba de phishing**: la credencial solo funciona en el dominio correcto.
- **Sin secreto compartido**: ninguna contraseña que robar, solo claves públicas del lado del servidor.
- **UX fluida**: basta un Touch ID, sin SMS ni TOTP.

## Authenticators

- **Platform** (integrados): Touch ID/Face ID, Windows Hello, biometría Android — gratuitos, pero históricamente ligados a un dispositivo.
- **Roaming** (externos): YubiKey, Titan Security Key, Feitian — portátiles y multidispositivo, pero hay que comprarlos y llevarlos encima.

## Passkeys: la evolución

Las passkeys sincronizan las credenciales entre dispositivos (iCloud Keychain, Google Password Manager, cuenta Microsoft), permiten la autenticación entre dispositivos mediante QR + Bluetooth y las gestionan los password managers (1Password, Dashlane, Bitwarden). Consecuencia: se acabó la pérdida de credencial al cambiar de teléfono.

## Comparación

| Mecanismo | ¿Phishable? | Fuerza | UX |
|-----------|-------------|-------|-----|
| Contraseña | Sí | Débil | Media |
| SMS OTP | Sí (SIM swap) | Media | Débil |
| TOTP | Sí (introducción) | Media | Media |
| Push (app del banco) | Parcialmente | Media | Buena |
| WebAuthn / Passkeys | No | Fuerte | Excelente |

## Nivel eIDAS y SCA

WebAuthn alcanza con facilidad el nivel Sustancial (authenticator certificado + biometría local), y el nivel Alto con hardware certificado (YubiKey FIPS) y un alta presencial. Para la SCA de la PSD2, combina inherencia (biometría) y posesión (el authenticator) — dos factores en un solo gesto. Los bancos de la UE lo adoptan progresivamente.

## Lo que WebAuthn / Passkeys no resuelve

- **No resuelve la identidad**: prueba la propiedad de la credencial, no quién eres (sigue siendo necesario un KYC inicial).
- **No resuelve la autorización**: solo la autenticación, no los scopes de OAuth.
- **No resuelve el robo de un dispositivo desbloqueado**: mitigado por la biometría obligatoria.
- **No es universal**: los navegadores antiguos no lo soportan (se necesita un fallback).
- **No resuelve el KYC a distancia**: abrir una cuenta sigue exigiendo probar la identidad (DNI electrónico, EUDI Wallet).

## Lo que WebAuthn / Passkeys no es

- **No es una wallet de identidad**: es una clave de autenticación, no un contenedor de atributos (vs EUDI Wallet).
- **No es una contraseña con hash**: es criptografía asimétrica.
- **No es una «clave biométrica»**: la biometría no sale del dispositivo, desbloquea la clave localmente.
- **No es FIDO U2F**: U2F era un segundo factor; FIDO2/WebAuthn permite la autenticación sin contraseña.

## En el ecosistema PSD2 / Open Finance

Es la evolución natural de la SCA: adopción creciente por los bancos (app y portal web), uso del lado del TPP para el back-office, desbloqueo de la EUDI Wallet e integración en Click to Pay para un checkout sin contraseña de tarjeta.

## Ejemplos concretos

- **Apple ID, cuenta de Google**: passkeys-first desde 2022-2023.
- **GitHub**: 2FA con passkey ampliamente adoptado por los desarrolladores.
- **Boursobank, N26, Revolut**: login en la app vía passkeys / biometría local.
- **Click to Pay**: estándar EMVCo basado en WebAuthn para el checkout sin introducir la tarjeta.
- **France Identité**: utiliza credenciales próximas a FIDO2 para la autenticación biométrica local.
- **SIM swap**: el fraude que mató la confianza en el OTP por SMS — WebAuthn es su antídoto.
- **YubiKey**: tras su despliegue interno en 2017, Google eliminó el phishing en sus cuentas.

## Fuentes

- [Web Authentication: An API for accessing Public Key Credentials (Level 2)](https://www.w3.org/TR/webauthn-2/) — W3C
- [Passkeys](https://fidoalliance.org/passkeys/) — FIDO Alliance

---

Fuente: https://openfinanceguide.com/es/glossary/webauthn-passkeys
