Approfondimento su user Verification

Questo documento illustra cos'è userVerification in WebAuthn e i comportamenti del browser che comportano la specifica di userVerification durante la creazione o l'autenticazione della passkey.

Che cos'è la "verifica dell'utente" in WebAuthn?

Le passkey si basano sulla crittografia a chiave pubblica. Creando una passkey, viene generata una coppia di chiavi pubblica-privata, la chiave privata viene archiviata dal provider di passkey e la chiave pubblica viene restituita al server della parte richiedente per l'archiviazione. Il server può autenticare un utente verificando una firma firmata dalla stessa passkey utilizzando la chiave pubblica accoppiata. Il flag "presente utente" (UP) su una credenziale di chiave pubblica dimostra che qualcuno ha interagito con il dispositivo durante l'autenticazione.

La verifica dell'utente è un livello opzionale di sicurezza che cerca di dichiarare che durante l'autenticazione era presente la persona corretta e non solo una persona, come afferma la presenza dell'utente. Sugli smartphone, di solito questo viene fatto utilizzando il meccanismo di blocco schermo, che può essere biometrico, PIN o password. L'esecuzione della verifica dell'utente viene segnalata nel flag "UV" che viene restituito nei dati dell'autenticatore durante la registrazione e l'autenticazione della passkey

Uno screenshot di una finestra di dialogo di verifica dell'utente sul portachiavi iCloud su macOS. La finestra di dialogo chiede all'utente di accedere usando Touch ID; vengono visualizzati l'origine che richiede l'autenticazione e il nome utente. In alto a destra nella finestra di dialogo è presente il pulsante "Annulla".
Finestra di dialogo di verifica dell'utente sul portachiavi iCloud su macOS.
Uno screenshot di una finestra di dialogo di verifica dell'utente su Chrome per Android. La finestra di dialogo chiede all'utente di verificare la propria identità utilizzando il riconoscimento facciale o il rilevamento delle impronte e mostra l'origine che richiede l'autenticazione. In basso a sinistra è presente un'opzione per la verifica tramite PIN.
Finestra di dialogo di verifica dell'utente su Chrome per Android.

Modalità di convalida di UP e UV sul server

I flag booleani di presenza dell'utente (UP) e quelli verificati dall'utente (UV) vengono segnalati al server nel campo dei dati dell'autenticatore. Durante l'autenticazione, i contenuti del campo dei dati dell'autenticatore possono essere convalidati verificando la firma mediante la chiave pubblica archiviata. Se la firma è valida, il server può considerare i flag veri e propri.

Una rappresentazione della struttura dei dati di autenticazione. Da sinistra a destra, ogni sezione della struttura dei dati legge "RP ID HASH" (32 byte), "FLAGS" (1 byte), "COUNTER" (4 byte, uint32 big-endian), "ATTESTE CRED". DATA" (lunghezza variabile se presente) ed "EXTENSIONS" (lunghezza variabile se presente (CBOR)). La sezione "FLAGS" è stata espansa per mostrare un elenco di potenziali flag, con le etichette "ED", "AT", "0", "BS", "BE", "UV", "0" e "UP".
Campi di dati di Authenticator in una credenziale di chiave pubblica.

Al momento della registrazione e dell'autenticazione della passkey, il server deve verificare che il flag UP sia true e se il flag UV sia true o false, a seconda del requisito.

Specificare il parametro userVerification

In base alla specifica WebAuthn, la parte soggetta a limitazioni può richiedere una verifica dell'utente con un parametro userVerification sia sulla creazione che sull'asserzione delle credenziali. Accetta 'preferred', 'required' o 'discouraged', il che significa rispettivamente:

  • 'preferred' (impostazione predefinita): è preferibile utilizzare un metodo di verifica dell'utente sul dispositivo, ma puoi ignorarlo se non è disponibile. La credenziale di risposta contiene un valore di flag UV pari a true se è stata eseguita la verifica dell'utente e false se non è stata eseguita la verifica UV.
  • 'required': è necessario richiamare un metodo di verifica dell'utente disponibile sul dispositivo. Se non è disponibile, la richiesta non riesce localmente. Ciò significa che la credenziale di risposta viene sempre restituita con il flag UV impostato su true.
  • 'discouraged': è sconsigliato utilizzare un metodo di verifica dell'utente. Tuttavia, a seconda del dispositivo, la verifica utente può essere eseguita comunque e il flag UV può contenere true o false.

Codice campione per la creazione di una passkey:

const publicKeyCredentialCreationOptions = {
  // ...
  authenticatorSelection: {
    authenticatorAttachment: 'platform',
    residentKey: 'required',
    requireResidentKey: true,
    userVerification: 'preferred'
  }
};

const credential = await navigator.credentials.create({
  publicKey: publicKeyCredentialCreationOptions
});

Codice campione per l'autenticazione tramite passkey:

const publicKeyCredentialRequestOptions = {
  challenge: /* Omitted challenge data... */,
  rpId: 'example.com',
  userVerification: 'preferred'
};

const credential = await navigator.credentials.get({
  publicKey: publicKeyCredentialRequestOptions
});

Quale opzione dovresti scegliere per userVerification?

Il valore userVerification da utilizzare dipende dai requisiti dell'applicazione e dalle esigenze relative all'esperienza utente.

Quando utilizzare userVerification='preferred'

Utilizza userVerification='preferred' se dai priorità all'esperienza utente rispetto alla protezione.

Ci sono ambienti in cui la verifica dell'utente è più fluida che protezione. Ad esempio, su macOS in cui Touch ID non è disponibile (perché il dispositivo non lo supporta, è disattivato o è in modalità clamshell), all'utente viene chiesto di inserire la password di sistema. Questo crea problemi e l'utente può abbandonare del tutto l'autenticazione. Se per te è più importante eliminare le difficoltà, usa userVerification='preferred'.

Uno screenshot di una finestra di dialogo delle passkey su macOS che viene visualizzata quando Touch ID non è disponibile. La finestra di dialogo contiene informazioni quali l'origine che richiede l'autenticazione e il nome utente. In alto a destra nella finestra di dialogo è presente il pulsante "Annulla".
Una finestra di dialogo delle passkey visualizzata su macOS quando Touch ID non è disponibile.

Con userVerification='preferred', il flag UV è true se la verifica dell'utente viene eseguita correttamente e false se la verifica utente viene saltata. Ad esempio, su macOS, dove Touch ID non è disponibile, chiede all'utente di fare clic su un pulsante per saltare la verifica dell'utente e la credenziale di chiave pubblica include un flag UV false.

Il flag UV può quindi essere un segnale nell'analisi del rischio. Se il tentativo di accesso sembra rischioso a causa di altri fattori, potresti voler sottoporre all'utente ulteriori verifiche di accesso se la verifica dell'utente non è stata eseguita.

Quando utilizzare userVerification='required'

Utilizza userVerification='required' se ritieni che sia UP che UV siano assolutamente necessari.

Uno svantaggio di questa opzione è che l'utente potrebbe riscontrare più difficoltà durante l'accesso. Ad esempio, su macOS, dove Touch ID non è disponibile, all'utente viene chiesto di inserire la password di sistema.

Con userVerification='required' puoi assicurarti che la verifica dell'utente venga eseguita sul dispositivo. Assicurati che il server verifichi che il flag UV sia true.

Conclusione

Sfruttando la verifica dell'utente, le parti che utilizzano le passkey possono valutare la probabilità che il proprietario del dispositivo acceda. Può scegliere se richiedere la verifica dell'utente o renderla facoltativa a seconda dell'impatto critico del meccanismo di accesso di riserva sul flusso degli utenti. Assicurati che il server controlli il flag UP e UV per l'autenticazione utente della passkey.