En pocas palabras
Credenciales FIDO basadas en pares de claves, utilizadas mediante WebAuthn y autenticadores. El servicio registra la clave pública y verifica pruebas de posesión de la privada, sin recibirla.
Qué problema resuelve
Contraseñas reutilizadas, robo de credenciales y acceso mediante sitios de phishing que imitan al servicio legítimo.
Cuándo utilizarlo
Acceso a aplicaciones web y móviles. Ejemplo: registrar una passkey y autorizar un inicio de sesión usando el PIN o la biometría local del dispositivo.
De la idea a la práctica
Funcionamiento, ejemplos y decisiones para pasar al siguiente nivel.
En el Radar compartido: Trial (valoración de la edición aportada).
Cómo funciona
El servidor genera un reto temporal. El navegador y el autenticador lo procesan para el sitio correspondiente y producen una respuesta firmada. El servidor verifica la firma, el reto, el origen y la asociación con el servicio antes de iniciar una sesión.
Ejemplo: recorrido de registro y acceso
- El usuario autenticado elige registrar una passkey.
- El autenticador crea la credencial y el servidor registra su identificador y clave pública.
- En el siguiente acceso, el servidor emite un reto nuevo.
- El usuario autoriza localmente la operación y el servidor verifica la respuesta.
Tipos de passkey
| Tipo | Dónde vive la clave | Características |
|---|---|---|
| Sincronizada | Gestor de credenciales (iCloud Keychain, Google Password Manager, gestores de terceros) | Disponible en todos los dispositivos del usuario; recuperación sencilla |
| Ligada al dispositivo | Llave de seguridad (FIDO2) o chip del dispositivo | No se copia; máxima garantía; requiere plan de pérdida |
Ambas son resistentes a phishing: la credencial está ligada al dominio (rpId) y no puede usarse en un sitio falso.
Registro en el servidor (TypeScript)
import {
generateRegistrationOptions,
verifyRegistrationResponse,
} from '@simplewebauthn/server';
const rpID = 'app.krediya.example';
const origin = `https://${rpID}`;
// 1. Opciones para el navegador
const opciones = await generateRegistrationOptions({
rpName: 'KrediYa',
rpID,
userName: usuario.email,
attestationType: 'none',
excludeCredentials: usuario.passkeys.map((p) => ({ id: p.id })),
authenticatorSelection: {
residentKey: 'required',
userVerification: 'preferred',
},
});
await guardarRetoTemporal(usuario.id, opciones.challenge); // un solo uso, con caducidad
// 2. Verificar la respuesta del navegador
const { verified, registrationInfo } = await verifyRegistrationResponse({
response: cuerpoRecibido,
expectedChallenge: await consumirReto(usuario.id),
expectedOrigin: origin,
expectedRPID: rpID,
});
if (verified && registrationInfo) {
const { credential } = registrationInfo;
await guardarPasskey(usuario.id, {
id: credential.id,
publicKey: credential.publicKey,
counter: credential.counter,
transports: credential.transports,
});
}
En el navegador, @simplewebauthn/browser (o la API navigator.credentials directamente) llama al autenticador con esas opciones.
Datos que guarda el servidor
| Campo | Uso |
|---|---|
| ID de credencial | Identificar qué passkey usa el usuario |
| Clave pública | Verificar firmas (no es secreta) |
| Contador | Detectar posibles clones en autenticadores que lo usan |
| Transportes, nombre | Mejorar la experiencia y la gestión («iPhone de Ana») |
| Fechas de creación y último uso | Auditoría y limpieza |
Experiencia de usuario
- Autocompletado (conditional UI): con
mediation: 'conditional'el navegador ofrece las passkeys en el campo de usuario, sin botón aparte. - Ofrecer crear una passkey justo después de un inicio de sesión exitoso con otro método.
- Permitir varias passkeys por cuenta y una pantalla para gestionarlas.
- Mantener un método de recuperación robusto: la recuperación débil se convierte en la vía de ataque.
En servicios financieros
Las passkeys sirven como factor resistente a phishing para el inicio de sesión. Para operaciones sensibles (cambio de dispositivo, desembolso a una cuenta nueva) conviene solicitar de nuevo verificación de usuario y combinar con señales de riesgo. Revisa los requisitos regulatorios locales sobre autenticación fuerte. Es una pieza central de Zero Trust para identidades de personas.
Criterios de implementación
Utiliza una biblioteca WebAuthn mantenida en lugar de implementar la verificación criptográfica manualmente. Los retos deben ser impredecibles, expirar y no reutilizarse. La biometría permanece en el dispositivo; las claves pueden sincronizarse según el proveedor. Evalúa el recorrido completo, incluida recuperación y pérdida de dispositivos.
Continúa en las fuentes
Documentación oficial para verificar detalles y explorar más.