Habilita la autenticación sólida con WebAuthn

El problema

La suplantación de identidad (phishing) es el principal problema de seguridad en la Web: el 81% de los incumplimientos de cuentas relacionados con el hackeo el año pasado se aprovecharon de contraseñas poco seguras o robadas. La respuesta colectiva de la industria a este problema fue la autenticación de varios factores, pero las implementaciones están fragmentadas y aún no abordan de forma adecuada la suplantación de identidad (phishing). Trabajamos con la Alianza FIDO desde 2013 y, más recientemente, con el W3C para implementar un protocolo estandarizado resistente a la suplantación de identidad (phishing) que se puede usar en cualquier aplicación web.

¿Qué es WebAuthn?

La API de Web Authentication brinda a las aplicaciones web acceso mediado por el usuario-agente a autenticadores, que a menudo son tokens de hardware a los que se accede a través de USB/BLE/NFC o módulos integrados directamente en la plataforma, con el fin de generar credenciales de clave pública centradas en la aplicación (eTLD+k). Esto permite una variedad de casos de uso, como los siguientes:

  • 2FA resistente a la suplantación de identidad (phishing) y de baja fricción (se debe usar junto con una contraseña).
  • Nueva autorización sin contraseña y basada en datos biométricos.
  • 2FA resistente a la suplantación de identidad (phishing) y de baja fricción sin una contraseña (para usar en cuentas sin contraseña).

La API está encaminada para implementarse en la mayoría de los navegadores principales y está diseñada para simplificar la IU que se encuentra cuando debes probar tu identidad en línea y reducir significativamente la suplantación de identidad (phishing).

WebAuthn extiende la API de Credential Management y agrega un nuevo tipo de credencial llamado PublicKeyCredential. WebAuthn abstrae la comunicación entre el navegador y un autenticador, y le permite al usuario hacer lo siguiente:

  1. Crea y registra una credencial de clave pública para un sitio web.
  2. Autentícate en un sitio web demostrando que tienes la clave privada correspondiente.

Los autenticadores son dispositivos que pueden generar pares de claves públicas/privadas y obtener consentimiento. El consentimiento para firmar se puede otorgar con un toque simple, una lectura correcta de la huella digital o por otros métodos, siempre que cumplan con los requisitos de FIDO2 (existe un programa de certificación para autenticadores de la Alianza FIDO). Los autenticadores pueden estar integrados en la plataforma (como escáneres de huellas digitales en smartphones) o conectarse a través de USB, Bluetooth de bajo consumo (BLE) o comunicación de campo cercano (NFC).

Cómo funciona

Crea un par de claves y registra un usuario

Cuando un usuario quiere registrar una credencial en un sitio web (al que WebAuthn se denomina “parte de confianza”), ocurre lo siguiente:

  1. El usuario de confianza genera un desafío.
  2. El usuario de confianza le solicita al navegador, a través de la API de Credential Manager, que genere una nueva credencial para el usuario de confianza y especifica las capacidades del dispositivo, p. ej., si el dispositivo proporciona su propia autenticación de usuario (con datos biométricos, etcétera).
  3. Después de que el autenticador obtiene el consentimiento del usuario, el autenticador genera un par de claves y muestra la clave pública y la certificación firmada opcional al sitio web.
  4. La aplicación web reenvía la clave pública al servidor.
  5. El servidor almacena la clave pública, junto con la identidad del usuario, a fin de recordar la credencial para autenticaciones futuras.
let credential = await navigator.credentials.create({ publicKey: {
  challenge: new Uint8Array([117, 61, 252, 231, 191, 241, ...]),
  rp: { id: "acme.com", name: "ACME Corporation" },
  user: {
    id: new Uint8Array([79, 252, 83, 72, 214, 7, 89, 26]),
    name: "jamiedoe",
    displayName: "Jamie Doe"
  },
  pubKeyCredParams: [ {type: "public-key", alg: -7} ]
}});

Autentica a un usuario

Cuando un sitio web necesita obtener pruebas de que interactúa con el usuario correcto, sigue estos pasos:

  1. El usuario de confianza genera un desafío y le proporciona al navegador una lista de credenciales registradas para el usuario. También puede indicar dónde buscar la credencial, p.ej., en un autenticador local integrado o en un autenticador externo mediante USB, BLE, etcétera.
  2. El navegador le solicita al autenticador que firme el desafío.
  3. Si el autenticador contiene una de las credenciales proporcionadas, el autenticador muestra una aserción firmada a la app web después de recibir el consentimiento del usuario.
  4. La app web reenvía la aserción firmada al servidor para que el usuario de confianza la verifique.
  5. Una vez que el servidor lo verifica, el flujo de autenticación se considera exitoso.
let credential = await navigator.credentials.get({ publicKey: {
  challenge: new Uint8Array([139, 66, 181, 87, 7, 203, ...]),
  rpId: "acme.com",
  allowCredentials: [{
    type: "public-key",
    id: new Uint8Array([64, 66, 25, 78, 168, 226, 174, ...])
  }],
  userVerification: "required",
}});

Prueba WebAuthn en https://webauthndemo.appspot.com/.

Próximos pasos

La versión beta de Chrome 67 incluye compatibilidad con navigator.credentials.get({publicKey: ...}) y navigator.credentials.create({publicKey:... }), y permite el uso de autenticadores U2F/CTAP 1 mediante transporte USB en computadoras de escritorio.

Las próximas versiones agregarán compatibilidad con más transportes, como BLE y NFC, y el nuevo protocolo de cable CTAP 2. También estamos trabajando en flujos más avanzados habilitados por CTAP 2 y WebAuthn, como los autenticadores protegidos por PIN, la selección local de cuentas (en lugar de escribir un nombre de usuario o contraseña) y la inscripción por huella digital.

Ten en cuenta que Microsoft Edge también admite la API y Firefox es compatible con WebAuthn a partir de Firefox 60.

Recursos

Estamos trabajando en documentación más detallada:

La sesión “Novedades del registro y acceso en la Web” de Google I/O 2018 abarcó WebAuthn.