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:
- Crie e registre uma credencial de chave pública para um site.
- 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":
- A parte confiável gera um desafio.
- 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.).
- 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.
- O app da Web encaminha a chave pública ao servidor.
- 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:
- 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.
- O navegador pede ao autenticador para assinar o desafio.
- 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.
- O app da Web encaminha a declaração assinada ao servidor para que a parte confiável faça a verificação.
- 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:
- Implementação de exemplo de parte confiável WebAuthnDemo
- Artigo análise do WebAuthn de Adam Langley
A sessão "O que há de novo na inscrição e no login na Web" do Google I/O 2018 abordou o WebAuthn.