# WebAuthn / Passkeys

> WebAuthn e Passkeys — autenticação forte sem senha

Padrão W3C / FIDO2 de autenticação forte por criptografia assimétrica, que permite fazer login por biometria ou chave física sem senha. As passkeys são a evolução sincronizada multidispositivo, já padrão no iOS, Android e Windows.

_Categoria: securite_

---

## Definição

O **WebAuthn** (_Web Authentication_) é um padrão W3C (2019), codesenvolvido com a FIDO Alliance sob o nome FIDO2, que permite a um site solicitar uma autenticação forte por criptografia assimétrica.

O usuário comprova sua identidade por meio de um authenticator (chave física, Touch ID, Windows Hello, Face ID), sem nunca digitar uma senha. As **passkeys** são sua evolução (2022+): credenciais WebAuthn sincronizadas entre dispositivos pela nuvem do fabricante (iCloud Keychain, Google Password Manager) ou entre dispositivos por QR code — tornaram-se o novo padrão de autenticação do grande público.

## Como funciona

No cadastro, o authenticator gera um par de chaves próprio do site: a chave privada nunca sai do secure element, e a chave pública é armazenada pelo site. No login, o site envia um desafio (challenge) que o authenticator assina com a chave privada (após o desbloqueio biométrico), e o site verifica a assinatura.

```mermaid
sequenceDiagram
    autonumber
    participant Browser as Navegador
    participant RP as Site (Relying Party)
    participant Auth as Authenticator<br/>(Touch ID / chave)

    Note over Browser,Auth: CADASTRO
    Browser->>RP: 1. Inicia o registro
    RP-->>Browser: 2. Challenge + info do RP
    Browser->>Auth: 3. navigator.credentials.create()
    Auth->>Auth: 4. Solicita biometria
    Auth->>Auth: 5. Gera par de chaves
    Auth-->>Browser: 6. Chave pública + attestation
    Browser->>RP: 7. Armazena a chave pública

    Note over Browser,Auth: LOGIN
    Browser->>RP: 8. Quer fazer login
    RP-->>Browser: 9. Challenge
    Browser->>Auth: 10. navigator.credentials.get()
    Auth->>Auth: 11. Solicita biometria
    Auth->>Auth: 12. Assina o challenge com a chave privada
    Auth-->>Browser: 13. Assinatura
    Browser->>RP: 14. Verificação
    RP-->>Browser: 15. Sessão aberta
```

A credencial é vinculada ao domínio (_origin binding_): um falso `examp1e.com` não tem a chave, o que torna o phishing impossível.

## As 3 propriedades-chave

- **À prova de phishing**: a credencial só funciona no domínio correto.
- **Sem segredo compartilhado**: nenhuma senha a roubar, apenas chaves públicas do lado do servidor.
- **UX fluida**: um Touch ID basta, sem SMS nem TOTP.

## Authenticators

- **Platform** (integrados): Touch ID/Face ID, Windows Hello, biometria Android — gratuitos, mas historicamente ligados a um dispositivo.
- **Roaming** (externos): YubiKey, Titan Security Key, Feitian — portáteis e multidispositivo, mas precisam ser comprados e carregados.

## Passkeys: a evolução

As passkeys sincronizam as credenciais entre dispositivos (iCloud Keychain, Google Password Manager, conta Microsoft), permitem a autenticação entre dispositivos por QR + Bluetooth e são geridas pelos password managers (1Password, Dashlane, Bitwarden). Consequência: fim da perda de credencial na troca de telefone.

## Comparação

| Mecanismo | Sujeito a phishing? | Força | UX |
|-----------|-------------|-------|-----|
| Senha | Sim | Fraca | Média |
| SMS OTP | Sim (SIM swap) | Média | Fraca |
| TOTP | Sim (digitação) | Média | Média |
| Push (app do banco) | Parcialmente | Média | Boa |
| WebAuthn / Passkeys | Não | Forte | Excelente |

## Nível eIDAS e SCA

O WebAuthn atinge facilmente o nível Substancial (authenticator certificado + biometria local), e o nível Elevado com hardware certificado (YubiKey FIPS) e um registro presencial. Para a SCA da PSD2, ele combina inerência (biometria) e posse (authenticator) — dois fatores em um único gesto. Os bancos da UE o adotam progressivamente.

## O que o WebAuthn / Passkeys não resolve

- **Não resolve a identidade**: prova a posse da credencial, não quem você é (um KYC inicial continua exigido).
- **Não resolve a autorização**: apenas a autenticação, não os escopos OAuth.
- **Não resolve o roubo de dispositivo desbloqueado**: mitigado pela biometria obrigatória.
- **Não é universal**: os navegadores antigos não o suportam (fallback necessário).
- **Não resolve o KYC remoto**: abrir uma conta ainda exige comprovar a identidade (documento de identidade, EUDI Wallet).

## O que o WebAuthn / Passkeys não é

- **Não é uma carteira de identidade**: é uma chave de autenticação, não um contêiner de atributos (vs EUDI Wallet).
- **Não é uma senha com hash**: é criptografia assimétrica.
- **Não é uma "chave biométrica"**: a biometria não sai do dispositivo, ela desbloqueia a chave localmente.
- **Não é o FIDO U2F**: o U2F era um segundo fator; o FIDO2/WebAuthn permite a autenticação sem senha.

## No ecossistema PSD2 / Open Finance

É a evolução natural da SCA: adoção crescente pelos bancos (app e portal web), uso do lado do TPP para o back-office, desbloqueio da EUDI Wallet e integração no Click to Pay para um checkout sem senha de cartão.

## Exemplos concretos

- **Apple ID, conta Google**: passkeys-first desde 2022-2023.
- **GitHub**: 2FA com passkey amplamente adotado pelos desenvolvedores.
- **Boursobank, N26, Revolut**: login no app via passkeys / biometria local.
- **Click to Pay**: padrão EMVCo baseado em WebAuthn para o checkout sem digitação de cartão.
- **France Identité**: usa credenciais próximas do FIDO2 para a autenticação biométrica local.
- **SIM swap**: a fraude que matou a confiança no OTP por SMS — o WebAuthn é seu antídoto.
- **YubiKey**: após sua implantação interna em 2017, o Google eliminou o phishing em suas contas.

## Fontes

- [Web Authentication: An API for accessing Public Key Credentials (Level 2)](https://www.w3.org/TR/webauthn-2/) — W3C
- [Passkeys](https://fidoalliance.org/passkeys/) — FIDO Alliance

---

Fonte: https://openfinanceguide.com/pt-br/glossary/webauthn-passkeys
