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 las cuentas relacionadas con el hackeo las violaciones de seguridad en la nube el año pasado aprovecharon contraseñas débiles o robadas. El colectivo de la industria respuesta a este problema ha sido la autenticación de varios factores, pero implementaciones están fragmentadas y la mayoría aún no aborda el phishing de forma adecuada. Trabajamos con FIDO Alliance desde de 2013 y, más recientemente, con el W3C para implementar una iniciativa a la suplantación de identidad (phishing) que puede usar cualquier aplicación web.

¿Qué es WebAuthn?

La API de Web Authentication le brinda a la Web acceso mediado por usuario-agente a autenticadores, que a menudo tokens de hardware a los que se accede a través de USB/BLE/NFC o módulos integrados directamente en el de aplicaciones, con el fin de generar y desafiar el alcance de las aplicaciones (eTLD+k). Esto permite una variedad de casos de uso, como los siguientes:

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

La API se implementará en la mayoría de los navegadores principales y está diseñada para simplifican la IU que se encuentra cuando tienes que demostrar tu identidad en línea y y reducir significativamente el phishing.

WebAuthn extiende la API de Credential Management y agrega una nueva el tipo de credencial llamado PublicKeyCredential. WebAuthn abstrae entre el navegador y un autenticador, y le permite al usuario:

  1. Crea y registra una credencial de clave pública para un sitio web.
  2. Autenticar en un sitio web demostrando que posees la información de la dirección .

Los autenticadores son dispositivos que pueden generar pares de claves públicas/privadas y recopilar consentimiento. El consentimiento para la firma se puede otorgar con solo presionar una vez, lo cual por medio de la lectura de huella digital, o por otros métodos, siempre que cumplan con (existe un programa de certificación para autenticadores de la FIDO Alliance). Los autenticadores pueden estar integrados la plataforma (como escáneres de huellas dactilares en smartphones) o conectadas mediante 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 desea registrar una credencial en un sitio web (al que hace referencia WebAuthn) como "parte de confianza"):

  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 haga lo siguiente: generar una nueva credencial para el usuario de confianza especificando el capacidades, p.ej., si el dispositivo proporciona su propia autenticación de usuario (con datos biométricos, etc.).
  3. Una vez que el autenticador obtiene el consentimiento del usuario, el autenticador genera clave y devuelve la clave pública y la certificación firmada opcional al sitio web.
  4. La app web reenvía la clave pública al servidor.
  5. El servidor almacena la clave pública, junto con la identidad del usuario, para 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 un usuario

Cuando un sitio web necesita obtener pruebas de que está interactuando con el sitio web correcto usuario:

  1. El usuario de confianza genera un desafío y proporciona una lista al navegador. de las credenciales registradas para el usuario. También puede indicar dónde buscar la credencial, p.ej., en un autenticador local integrado o en un externa a través de USB, BLE, etc.
  2. El navegador le solicita al autenticador que firme el desafío.
  3. Si el autenticador contiene una de las credenciales dadas, este Devuelve 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 el usuario de confianza. para verificar.
  5. Una vez que el servidor verifica el flujo de autenticación, se considera y 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 por tu cuenta en https://webauthndemo.appspot.com/.

¿Qué sigue?

La versión beta de Chrome 67 se envía con compatibilidad para navigator.credentials.get({publicKey: ...}) y navigator.credentials.create({publicKey:... }), y permite usar Autenticadores U2F/CTAP 1 a través del transporte USB en computadoras de escritorio.

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

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 una documentación más detallada:

La sesión "Novedades sobre el registro y el acceso en la Web" en Google I/O 2018 cubrió WebAuthn.