Attivazione dell'autenticazione avanzata con WebAuthn

Il problema

Il phishing è il principale problema di sicurezza sul web: l'81% delle violazioni di account legate alla pirateria informatica lo scorso anno ha fatto ricorso a password deboli o rubate. La risposta collettiva del settore a questo problema è stata l'autenticazione a più fattori, ma le implementazioni sono frammentate e la maggior parte non affronta ancora in modo adeguato il phishing. Collaboriamo con la FIDO Alliance dal 2013 e, più recentemente, con il W3C per implementare un protocollo standardizzato antiphishing che possa essere utilizzato da qualsiasi applicazione web.

Che cos'è WebAuthn?

L'API Web Authentication fornisce alle applicazioni web l'accesso mediato dagli user agent agli autori di autenticazione, spesso token hardware a cui si accede tramite USB/BLE/NFC o moduli integrati direttamente nella piattaforma, allo scopo di generare e richiedere credenziali a chiave pubblica basate sulle applicazioni (eTLD+k). Ciò consente una varietà di casi d'uso, come:

  • 2FA a basso attrito e a prova di phishing (da utilizzare in combinazione con una password).
  • Nuova autorizzazione senza password basata su biometria.
  • 2FA a basso attrito e a prova di phishing senza password (da utilizzare per gli account senza password).

L'API è sulla buona strada per essere implementata dalla maggior parte dei principali browser e ha lo scopo di semplificare l'interfaccia utente incontrata quando devi dimostrare la tua identità online e ridurre notevolmente il phishing.

WebAuthn estende l'API Credential Management e aggiunge un nuovo tipo di credenziali chiamato PublicKeyCredential. WebAuthn astrae la comunicazione tra il browser e un autenticatore e consente a un utente di:

  1. Crea e registra una credenziale di chiave pubblica per un sito web.
  2. Esegui l'autenticazione su un sito web dimostrando di essere in possesso della chiave privata corrispondente.

Gli Authenticator sono dispositivi in grado di generare coppie di chiavi private/pubbliche e raccogliere il consenso. Il consenso alla firma può essere concesso con un semplice tocco, con una corretta lettura delle impronte oppure con altri metodi, a condizione che siano conformi ai requisiti FIDO2 (esiste un programma di certificazione per gli amministratori di FIDO Alliance). Gli Authenticator possono essere integrati nella piattaforma (come 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 per un sito web (definito da WebAuthn come "parte affidabile"):

  1. La parte affidante genera una sfida.
  2. La parte affidante chiede al browser, tramite l'API Credential Manager, di generare una nuova credenziale per la parte attendibile, specificando le funzionalità del dispositivo, ad esempio se il dispositivo fornisce la propria autenticazione utente (con biometria e così via).
  3. Dopo che l'autenticatore ha ottenuto il consenso dell'utente, genera una coppia di chiavi e restituisce la chiave pubblica e l'attestazione firmata facoltativa al sito web.
  4. L'app web inoltra la chiave pubblica al server.
  5. Il server archivia la chiave pubblica, insieme all'identità dell'utente, per memorizzare 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 che sta interagendo con l'utente corretto:

  1. La parte richiedente genera una richiesta di verifica e fornisce al browser un elenco di credenziali registrate per l'utente. Può anche indicare dove cercare la credenziale, ad esempio in un autenticatore locale integrato o esterno tramite USB, BLE e così via.
  2. Il browser chiede all'autenticatore di firmare la richiesta di verifica.
  3. Se l'autenticatore contiene una delle credenziali fornite, restituisce un'asserzione firmata all'app web dopo aver ricevuto il consenso dell'utente.
  4. L'app web inoltra l'asserzione firmata al server per la verifica della parte richiedente.
  5. 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 c'è davanti?

Chrome 67 beta include il supporto per navigator.credentials.get({publicKey: ...}) e navigator.credentials.create({publicKey:... }) e consente di utilizzare gli autenticatori U2F/CTAP 1 tramite trasporto USB su computer.

Le prossime release includeranno il supporto per altri mezzi di trasporto come BLE e NFC e il più recente protocollo CTAP a due fili. Stiamo inoltre lavorando a flussi più avanzati abilitati da CTAP 2 e WebAuthn, come gli autori di autenticazione protetti da PIN, la selezione locale degli account (invece di digitare un nome utente o una password) e la registrazione con l'impronta digitale.

Tieni presente che anche Microsoft Edge supporta l'API e Firefox supporta WebAuthn a partire da Firefox 60.

Risorse

Stiamo lavorando a una documentazione più dettagliata:

La sessione "Novità delle registrazioni e l'accesso sul web" alla conferenza Google I/O 2018 ha riguardato WebAuthn.