Marcio Cunha

Passkeys y WebAuthn: Cómo Abandonar Contraseñas Sin Romper el Inicio de Sesión

Aprende a implementar passkeys y WebAuthn para eliminar contraseñas tradicionales de tu sistema sin alienar usuarios ni romper flujos heredados de autenticación. Una guía práctica de arquitectura y código.

Marcio Cunha12 min
También disponible en:EnglishPortuguês
Resumen
  • La autenticación basada en criptografía asimétrica elimina los riesgos asociados con la filtración de credenciales en servidores.
  • El estándar WebAuthn permite interactuar de forma nativa con llaves de hardware y biometría del dispositivo mediante el navegador.
  • Las estrategias de migración gradual garantizan que los usuarios heredados conserven el acceso mientras adoptan el nuevo paradigma.
  • La experiencia de usuario mejora notablemente al reemplazar la escritura compleja por un toque en la biometria del dispositivo.
  • Las aplicaciones web modernas y los sistemas empresariales obtienen una sólida defensa contra ataques de phishing e interceptación.

El Fin de la Era de las Contraseñas y la Promesa Criptográfica

Las contraseñas tradicionales han fracasado. Miles de millones de ellas se filtran cada año, alimentando ataques automatizados que explotan la tendencia humana a reutilizar la misma combinación en múltiples servicios. En la práctica, exigir que el usuario cree una secuencia de caracteres compleja, la cambie cada noventa días y además logre memorizarla es un fallo de diseño humano, no de tecnología. La alternativa viable que finalmente está ganando terreno en la industria es el uso de llaves de acceso, conocidas en el mercado como passkeys.

Las passkeys utilizan criptografía asimétrica, un concepto ingenioso donde generamos un par de llaves matemáticas: una llave pública que se almacena de forma segura en el servidor de la aplicación, y una llave privada que nunca abandona el dispositivo seguro del usuario, como su teléfono móvil o portátil. Cuando intentas iniciar sesión en un sitio web, el servidor envía un desafío matemático que solo tu llave privada es capaz de resolver. En la práctica, esto significa que incluso si un atacante irrumpe en la base de datos de la empresa, solo encontrará llaves públicas inútiles, volviendo el robo masivo de credenciales técnicamente inviable.

Dentro de WebAuthn: El Motor Detrás de las Llaves de Acceso

Detrás de las passkeys existe un estándar abierto llamado WebAuthn, creado por el consorcio W3C en colaboración con las mayores empresas tecnológicas del mundo. WebAuthn es la API que permite a los navegadores web y sistemas operativos comunicarse de forma estandarizada con hardware de seguridad y lectores biométricos, como huellas dactilares o reconocimiento facial. Sin esta especificación, cada fabricante crearía su propia manera de validar identidades, convirtiendo la vida del desarrollador en una pesadilla de integraciones propietarias.

Cuando implementamos WebAuthn, dividimos el flujo en dos etapas fundamentales: el registro, conocido técnicamente como inscripción, y el inicio de sesión, llamado autenticación. Durante el registro, el navegador solicita al autenticador del dispositivo que genere un nuevo par de llaves exclusivamente para ese sitio web específico. Esto previene un ataque muy común llamado phishing, donde un sitio falso finge ser el original, ya que la llave generada está vinculada estrictamente a la dirección real del dominio, bloqueando su uso en cualquier otra URL.

Diseñando una Arquitectura de Transición Sin Fricción

Uno de los mayores temores de los ingenieros al adoptar nuevas tecnologías de autenticación es romper el sistema existente para quienes no tienen dispositivos compatibles o simplemente prefieren los métodos tradicionales. La transición a passkeys no debe ser un evento binario de todo o nada, sino una migración gradual e inteligente. En la práctica, debes diseñar tu arquitectura para soportar múltiples factores de autenticación simultáneamente, permitiendo que la llave de acceso conviva pacíficamente con contraseñas o códigos enviados por SMS.

Para facilitar esta convivencia, la base de datos de tu aplicación debe ser lo suficientemente flexible para asociar a un mismo usuario con múltiples métodos de credenciales. Cada llave registrada recibe un identificador único, un contador de uso para prevenir clonaciones y metadatos que indican el tipo de dispositivo utilizado. Cuando el usuario accede al sistema, el backend identifica qué opciones están disponibles para esa cuenta y presenta la interfaz más adecuada, priorizando la passkey cuando el navegador soporte la función.

Implementando el Registro con Código Práctico

Vamos a la práctica analizando cómo estructurar el inicio del proceso de registro de una passkey en el lado del servidor. El flujo comienza cuando el navegador pide al backend un conjunto de parámetros criptográficos conocidos como opciones de desafío. A continuación tenemos un ejemplo en Node.js que demuestra cómo generar este payload inicial utilizando una librería compatible con el estándar.

const { generateRegistrationOptions } = require(\'@simplewebauthn/server\');

async function handleRegistrationRequest(req, res) {
  const user = req.user;
  
  const options = await generateRegistrationOptions({
    rpName: \'Aplicación Segura\',
    rpID: \'app.ejemplo.com\',
    userID: user.id,
    userName: user.email,
    attestationType: \'none\',
    excludeCredentials: user.passkeys.map(pk => ({
      id: pk.id,
      type: \'public-key\',
      transports: pk.transports,
    })),
    authenticatorSelection: {
      residentKey: \'preferred\',
      userVerification: \'required\',
    },
  });

  // Guardamos el desafío temporalmente en la sesión del usuario
  req.session.currentChallenge = options.challenge;
  
  res.json(options);
}

Este código prepara el terreno para que el navegador active el lector biométrico del usuario. El parámetro userVerification: 'required' garantiza que el sistema operativo exija confirmación física mediante biometría o PIN antes de liberar la creación de la llave. Esto resuelve definitivamente el fallo de seguridad donde alguien toma una computadora desbloqueada ajena y realiza acciones en su nombre.

Manejo de Casos Borde y Obstáculos Operativos

La adopción de tecnologías modernas conlleva desafíos operativos que exigen atención redoblada del equipo de ingeniería. Uno de los escenarios más complejos ocurre cuando el usuario cambia de teléfono móvil o pierde el acceso al dispositivo principal donde estaba almacenada la llave. Si la llave se generó estrictamente en un chip de hardware aislado sin sincronización en la nube, el acceso a la cuenta podría perderse permanentemente, generando un pico de tickets de soporte.

Para mitigar este riesgo, las principales plataformas del mercado, como Apple, Google y administradores de contraseñas de terceros, ofrecen hoy sincronización cifrada de passkeys en la nube. En la práctica, esto significa que si compras un teléfono nuevo, tus llaves de acceso migran de forma segura junto con tu cuenta, combinando la conveniencia del ecosistema con la seguridad intransigente de la criptografía de llave pública. Como desarrollador, tu rol es garantizar flujos alternativos de recuperación de cuenta basados en identidad verificada.

Consideraciones Finales y el Futuro Sin Contraseñas

Abandonar las contraseñas tradicionales dejó de ser una utopía de laboratorio para convertirse en una realidad viable y altamente recomendada para aplicaciones modernas. El uso combinado de passkeys y WebAuthn ofrece una defensa sin precedentes contra ataques de ingeniería social, reduce los costos operativos de soporte por restablecimiento de credenciales y entrega una experiencia fluida que anima a los usuarios a adoptar mejores prácticas de seguridad sin esfuerzo adicional.

El viaje de migración exige planificación arquitectónica, pruebas rigurosas de compatibilidad entre navegadores y una estrategia inteligente de convivencia con métodos heredados. Sin embargo, el esfuerzo compensa con creces al posicionar tu producto a la vanguardia de la seguridad digital, eliminando el eslabón más débil de toda la cadena informática: el comportamiento humano en relación con las contraseñas complejas.