Como ativar a autenticação forte com a WebAuthn

O problema

O phishing é o principal problema de segurança na Web: 81% das violações de conta relacionadas a hackers no ano passado usaram senhas fracas ou roubadas. A resposta coletiva do setor a esse problema tem sido a autenticação multifator, mas as implementações são fragmentadas e a maioria ainda não combate o phishing de maneira adequada. Trabalhamos com a FIDO Alliance desde 2013 e, mais recentemente, com o W3C para implementar um protocolo padronizado resistente a phishing que pode ser usado por qualquer aplicativo da Web.

O que é a WebAuthn?

A API Web Authentication oferece a aplicativos da Web acesso mediado por user agent a autenticadores, que geralmente são tokens de hardware acessados por USB/BLE/NFC ou módulos integrados diretamente à plataforma, com a finalidade de gerar e desafiar credenciais de chave pública no escopo do aplicativo (eTLD+k). Isso permite diversos casos de uso, como:

  • 2FA de baixo atrito e resistente a phishing (para ser usada com uma senha).
  • Reautorização sem senha e com base em biometria
  • 2FA de baixo atrito e resistente a phishing sem senha (para contas sem senha).

A API está prestes a ser implementada pela maioria dos principais navegadores e pretende simplificar a interface encontrada quando você precisa provar sua identidade on-line e reduzir significativamente o phishing.

O WebAuthn estende a API Credential Management e adiciona um novo tipo de credencial chamado PublicKeyCredential. O WebAuthn abstrai a comunicação entre o navegador e um autenticador e permite que o usuário:

  1. Crie e registre uma credencial de chave pública para um site.
  2. Faça a autenticação em um site comprovando a posse da chave privada correspondente.

Os autenticadores são dispositivos que podem gerar pares de chaves privada/pública e solicitar consentimento. O consentimento para assinatura pode ser concedido com um simples toque, uma leitura de impressão digital bem-sucedida ou por outros métodos, desde que obedeçam aos requisitos da FIDO2 (há um programa de certificação para autenticadores pela FIDO Alliance). Os autenticadores podem ser integrados à plataforma (como leitores de impressão digital em smartphones) ou conectados por USB, Bluetooth de baixa energia (BLE) ou comunicação a curta distância (NFC, na sigla em inglês).

Como funciona

Como criar um par de chaves e registrar um usuário

Quando um usuário quer registrar uma credencial em um site, conhecido por WebAuthn como "parte confiável":

  1. A parte confiável gera um desafio.
  2. A parte confiável solicita que o navegador, usando a API Credential Manager, gere uma nova credencial para a parte confiável, especificando os recursos do dispositivo, por exemplo, se o dispositivo fornece a própria autenticação do usuário (com biometria etc.).
  3. Depois que o autenticador recebe o consentimento do usuário, ele gera um par de chaves e retorna a chave pública e o atestado assinado opcional para o site.
  4. O app da Web encaminha a chave pública ao servidor.
  5. O servidor armazena a chave pública, associada à identidade do usuário, para lembrar a credencial para autenticações 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} ]
}});

Como autenticar um usuário

Quando um site precisa de provas de que está interagindo com o usuário correto:

  1. A parte confiável gera um desafio e fornece ao navegador uma lista de credenciais registradas para o usuário. Ele também pode indicar onde procurar a credencial, por exemplo, em um autenticador integrado local ou em um externo via USB, BLE etc.
  2. O navegador pede ao autenticador para assinar o desafio.
  3. Se o autenticador tiver uma das credenciais fornecidas, ele retornará uma declaração assinada para o app da Web depois de receber o consentimento do usuário.
  4. O app da Web encaminha a declaração assinada ao servidor para que a parte confiável faça a verificação.
  5. Depois de verificado pelo servidor, o fluxo de autenticação é considerado bem-sucedido.
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",
}});

Teste o WebAuthn por conta própria em https://webauthndemo.appspot.com/.

O que vem por aí?

O Chrome 67 Beta tem suporte a navigator.credentials.get({publicKey: ...}) e navigator.credentials.create({publicKey:... }) e permite o uso de autenticadores de U2F/CTAP 1 por transporte USB em computadores.

As próximas versões vão adicionar suporte a mais transportes, como BLE e NFC, e o protocolo com fio CTAP 2 mais recente. Também estamos trabalhando em fluxos mais avançados ativados pelo CTAP 2 e o WebAuthn, como autenticadores protegidos por PIN, seleção local de contas (em vez de digitar um nome de usuário ou senha) e registro de impressão digital.

O Microsoft Edge também oferece suporte à API, e o Firefox é compatível com o WebAuthn a partir do Firefox 60.

Recursos

Estamos trabalhando em uma documentação mais detalhada:

A sessão "O que há de novo na inscrição e no login na Web" do Google I/O 2018 abordou o WebAuthn.