Como ativar a autenticação forte com a WebAuthn

O problema

Phishing é o principal problema de segurança da Web: 81% das contas relacionadas a invasões de segurança no ano passado aproveitaram senhas fracas ou roubadas. O coletivo do setor resposta a esse problema foi a autenticação multifator, mas implementações são fragmentadas e a maioria ainda não aborda o phishing de maneira adequada. Trabalhamos com a FIDO Alliance desde em 2013 e, mais recentemente, com o W3C para implementar resistente a phishing que pode ser usado por qualquer aplicativo da Web.

O que é WebAuthn?

A API Web Authentication oferece suporte a Web de aplicativos de segurança, mediado por user agent, a autenticadores que, muitas vezes, tokens de hardware acessados por USB/BLE/NFC ou por módulos integrados diretamente ao plataforma) com a finalidade de gerar e desafiar o escopo do aplicativo (eTLD+k). Isso permite uma variedade de casos de uso, tais como:

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

A API está prestes a ser implementada pela maioria dos principais navegadores e tem como objetivo simplificam a interface que você encontra ao comprovar sua identidade on-line e reduzem significativamente o phishing.

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

  1. Criar e registrar uma credencial de chave pública para um site.
  2. Autenticar um site provando a posse do domínio privado correspondente de dados.

Autenticadores são dispositivos que podem gerar pares de chaves públicas/privadas e coletar consentimento O consentimento para assinatura pode ser dado com um simples toque, um leitura de impressão digital ou por outros métodos, desde que estejam em conformidade com a FIDO2 (há um programa de certificação para autenticadores pela FIDO Alliance). Os autenticadores podem ser integrados na plataforma (como leitores de impressão digital em smartphones) ou conectados por meio de 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 (referido pelo 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, para gerar uma nova credencial para a parte confiável, especificando o dispositivo recursos, por exemplo, se o dispositivo fornece a própria autenticação do usuário (com biometria etc.).
  3. Depois que o autenticador obtém o consentimento do usuário, ele gera uma e retorna a chave pública e o atestado opcional assinado ao site.
  4. O app da Web encaminha a chave pública para o servidor.
  5. O servidor armazena a chave pública, juntamente com a 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 serviço usuário:

  1. A parte confiável gera um desafio e fornece ao navegador uma lista de credenciais registradas para o usuário. Também pode indicar para onde procure a credencial, por exemplo, em um autenticador integrado local ou em um externo por USB, BLE etc.
  2. O navegador solicita que o autenticador assine o desafio.
  3. Se o autenticador tiver uma das credenciais fornecidas, retorna uma declaração assinada para o app da Web após receber o consentimento do usuário.
  4. O app da Web encaminha a declaração assinada ao servidor para a parte confiável para verificar.
  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 em https://webauthndemo.appspot.com/.

O que vem por aí?

O Chrome 67 Beta é compatível com navigator.credentials.get({publicKey: ...}) e navigator.credentials.create({publicKey:... }) e permite o uso Autenticadores U2F/CTAP 1 por transporte USB no computador.

As próximas versões serão compatíveis com mais transportes, como BLE e NFC. o protocolo mais recente CTAP 2. Também estamos trabalhando em fluxos mais avançados ativados pelo CTAP 2 e WebAuthn, como autenticadores com PIN protegido, seleção de contas (em vez de digitar um nome de usuário ou uma senha) e registro de impressão digital.

O Microsoft Edge também oferece suporte à API O Firefox oferece suporte ao WebAuthn a partir da versão 60 do Firefox.

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" no Google I/O 2018 cobrimos a WebAuthn.