Approfondimento su user Verification

Questo documento illustra che cos'è userVerification in WebAuthn e i comportamenti del browser che si verificano quando userVerification viene specificato 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 fornitore della passkey e la chiave pubblica viene restituita al server della terza parte attendibile (RP) per essere archiviata. Il server può autenticare un utente verificando una firma firmata dalla stessa passkey utilizzando la chiave pubblica accoppiata. L'indicatore "utente presente" (UP) in una credenziale con chiave pubblica dimostra che qualcuno ha interagito con il dispositivo durante l'autenticazione.

La verifica dell'utente è un livello di sicurezza facoltativo che mira a verificare che la persona corretta fosse presente durante l'autenticazione, non solo una persona, come afferma la presenza dell'utente. Sugli smartphone, in genere viene utilizzato il meccanismo di blocco schermo, che si tratti di un dato biometrico, di un PIN o di una password. L'eventuale esecuzione della verifica dell'utente viene segnalata nel flag "UV" 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 utilizzando Touch ID, mostrando l'origine che richiede l'autenticazione, nonché il nome utente. In alto a destra nella finestra di dialogo è presente un pulsante denominato "Annulla".
Finestra di dialogo di verifica dell'utente nel 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 dell'impronta e mostra l'origine che richiede l'autenticazione. In basso a sinistra è presente un'opzione per la verifica tramite PIN.
Dialogo di verifica dell'utente su Chrome per Android.

Come vengono convalidati UP e UV sul server

I flag booleani presenza utente (UP) e verifica 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 utilizzando la chiave pubblica archiviata. Se la firma è valida, il server può considerare attendibili gli indicatori.

Una rappresentazione della struttura dei dati di autenticazione. Da sinistra a destra, ogni sezione della struttura di dati indica "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" viene espansa per mostrare un elenco di potenziali indicatori, etichettati da sinistra a destra: "ED", "AT", "0", "BS", "BE", "UV", "0" e "UP".
I campi dei dati dell'autenticatore in una credenziale con chiave pubblica.

Durante la registrazione e l'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.

Specifica del parametro userVerification

In base alla specifica WebAuthn, l'RP può richiedere una verifica dell'utente con un parametro userVerification sia durante la creazione che durante l'affermazione della credenziale. Accetta 'preferred', 'required' o 'discouraged', che significano rispettivamente:

  • 'preferred' (valore predefinito): è preferibile utilizzare un metodo di verifica utente sul dispositivo, ma se non è disponibile, questo passaggio può essere saltato. La credenziale di risposta contiene un valore del flag UV pari a true se è stata eseguita la verifica dell'utente e false se la verifica dell'utente non è stata eseguita.
  • 'required': è necessario invocare un metodo di verifica dell'utente disponibile sul dispositivo. Se non è disponibile, la richiesta non va a buon fine a livello locale. Ciò significa che la credenziale di risposta viene sempre restituita con il flag UV impostato su true.
  • 'discouraged': l'utilizzo di un metodo di verifica utente è sconsigliato. Tuttavia, a seconda del dispositivo, la verifica dell'utente potrebbe essere eseguita comunque e il flag UV potrebbe contenere true o false.

Codice di esempio per la creazione di passkey:

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

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

Codice di esempio per l'autenticazione con 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 dell'esperienza utente.

Quando utilizzare userVerification='preferred'

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

Esistono ambienti in cui la verifica dell'utente è più problematica che protettiva. Ad esempio, su macOS, dove Touch ID non è disponibile (perché il dispositivo non lo supporta, è disabilitato o è in modalità a conchiglia), all'utente viene chiesto di inserire la password di sistema. Ciò causa attriti e l'utente potrebbe abbandonare del tutto l'autenticazione. Se per te è più importante eliminare le difficoltà, utilizza userVerification='preferred'.

Uno screenshot di una finestra di dialogo della passkey su macOS che viene visualizzata quando Touch ID non è disponibile. La finestra di dialogo contiene informazioni come l'origine che richiede l'autenticazione e il nome utente. In alto a destra nella finestra di dialogo è presente un pulsante denominato "Annulla".
Una finestra di dialogo della 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 viene saltata. Ad esempio, su macOS, dove Touch ID non è disponibile, viene chiesto all'utente di fare clic su un pulsante per saltare la verifica dell'utente e la credenziale della chiave pubblica include un flag UV false.

L'indicatore UV può quindi essere un indicatore nell'analisi del rischio. Se il tentativo di accesso sembra rischioso a causa di altri fattori, ti consigliamo di presentare all'utente ulteriori verifiche di accesso se non è stata eseguita la verifica dell'utente.

Quando utilizzare userVerification='required'

Utilizza userVerification='required' se ritieni che sia assolutamente necessario utilizzare sia UP che UV.

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 si basano sulle passkey possono valutare la probabilità che il proprietario del dispositivo acceda. È una scelta se richiedere la verifica dell'utente o renderla facoltativa, a seconda dell'impatto del meccanismo di accesso alternativo sul flusso utente. Assicurati che il server controlli i flag UP e UV per l'autenticazione utente tramite passkey.