Il problema
Il phishing è il principale problema di sicurezza del web: l'81% degli account correlati alla pirateria informatica violazioni rubate lo scorso anno hanno sfruttato password inefficaci o rubate. Il team del settore a questo problema è l'autenticazione basata su più fattori, ma le implementazioni sono frammentate e la maggior parte non affronta ancora in modo adeguato il phishing. Collaboriamo con la FIDO Alliance da quando 2013 e, più recentemente, con il W3C di implementare un modello resistente al phishing che può essere utilizzato da qualsiasi applicazione web.
Che cos'è WebAuthn?
L'API Web Authentication fornisce al Web dell'accesso mediato dallo user agent delle applicazioni agli autenticatori, che sono spesso a token hardware accessibili tramite USB/BLE/NFC o moduli integrati direttamente nel Platform, allo scopo di generare e creare problemi nell'ambito delle applicazioni Credenziali di chiave pubblica (eTLD+k). Ciò consente una varietà di casi d'uso, ad esempio:
- 2FA a basso attrito e resistente al phishing (da utilizzare insieme a una password).
- Nuova autorizzazione senza password basata sulla biometria.
- 2FA a basso attrito e resistente al phishing senza password (da usare per gli account senza password).
L'API è in procinto di essere implementata dalla maggior parte dei principali browser ed è pensata per semplificheranno l'UI incontrata quando dovevi verificare la tua identità online, ridurre in modo significativo il phishing.
WebAuthn estende l'API di gestione delle credenziali e aggiunge una nuova
di credenziale denominato PublicKeyCredential
. WebAuthn astrae
la comunicazione tra il browser e un autenticatore e consente all'utente di:
- Crea e registra una credenziale di chiave pubblica per un sito web.
- Effettua l'autenticazione su un sito web dimostrando il possesso dei contenuti privati corrispondenti chiave.
Gli app Authenticator sono dispositivi che possono generare coppie di chiavi private/pubbliche e raccogliere consenso. Il consenso per la firma può essere concesso con un semplice tocco, lettura dell'impronta digitale o con altri metodi, purché conformi allo standard FIDO2 requisiti (esiste un programma di certificazione per di autenticazione da parte della FIDO Alliance). Google Authenticator può essere integrata alla piattaforma (ad esempio gli scanner di impronte digitali sugli smartphone) o collegati tramite USB, Bluetooth Low Energy (BLE) o Near Field Communication (NFC).
Come funziona
Creazione di una coppia di chiavi e registrazione di un utente
Quando un utente vuole registrare una credenziale in un sito web (indicata da WebAuthn in qualità di "parte coinvolta"):
- La parte coinvolta genera una verifica.
- Il componente chiede al browser, tramite l'API Credential Manager, di generare una nuova credenziale per la parte, specificando funzionalità, ad esempio se il dispositivo fornisce la propria autenticazione utente (la biometria ecc.).
- Dopo aver ottenuto il consenso dell'utente, l'autenticatore genera un chiave pubblica e restituisce la chiave pubblica e l'attestazione firmata facoltativa al sito web.
- L'app web inoltra la chiave pubblica al server.
- Il server archivia la chiave pubblica, insieme all'identità dell'utente, la credenziale per le autenticazioni future.
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} ]
}});
Autenticazione di un utente
Quando un sito web deve ottenere la prova di interagire con il sito utente:
- La parte coinvolta genera una verifica e fornisce al browser un elenco di credenziali registrate per l'utente. Può anche indicare dove la credenziale, ad esempio su un autenticatore integrato locale o su una esterna tramite USB, BLE ecc.
- Il browser chiede all'autenticatore di firmare la verifica.
- Se l'autenticatore contiene una delle credenziali specificate, restituisce un'asserzione firmata all'app web dopo aver ricevuto il consenso dell'utente.
- L'app web inoltra l'asserzione firmata al server per la parte coinvolta da verificare.
- Una volta verificato dal server, il flusso di autenticazione viene considerato riuscito.
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",
}});
Prova WebAuthn su https://webauthndemo.appspot.com/.
Cosa ci aspetta?
Chrome 67 beta viene fornito con il supporto per navigator.credentials.get({publicKey: ...})
e navigator.credentials.create({publicKey:... })
e consente l'utilizzo
autenticatori U2F/CTAP 1 tramite trasporto USB su computer.
Le prossime release supporteranno altri trasporti, come BLE e NFC e il più recente protocollo CTAP a 2 cavi. Stiamo anche lavorando a flussi più avanzati abilitati da CTAP 2 e WebAuthn, come gli autenticatori protetti da PIN, selezionare account (anziché digitare un nome utente o una password) registrazione dell'impronta digitale.
Tieni presente che Microsoft Edge supporta anche l'API e Firefox supporta WebAuthn a partire da Firefox 60.
Risorse
Stiamo lavorando a una documentazione più dettagliata:
- Esempio di parte di base WebAuthnDemo implementazione
- Analisi di WebAuthn articolo di Adam Langley
La sessione "Novità relative alla registrazione e all'accesso sul Web" al Google I/O 2018 ha trattato WebAuthn.