Approfondimento su user Verification

Questo documento illustra cosa è presente userVerification in WebAuthn e i comportamenti del browser che si verificano quando userVerification viene specificato durante la creazione della passkey o l'autenticazione.

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

Le passkey si basano sulla crittografia a chiave pubblica. Con la creazione di 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 di base (RP) per archiviarla. Il server può autenticare un utente verificando una firma firmata dalla stessa passkey con la chiave pubblica accoppiata. L'"utente presente" Il flag (UP) su una credenziale di chiave pubblica dimostra che qualcuno ha interagito con il dispositivo durante l'autenticazione.

La verifica dell'utente è un livello di sicurezza opzionale che mira ad affermare che durante l'autenticazione era presente la persona corretta e non solo una persona, come afferma la presenza dell'utente. Sugli smartphone, questa operazione viene in genere eseguita utilizzando il meccanismo di blocco schermo, che si tratti di un dato biometrico, un PIN o una password. Se la verifica dell'utente è stata eseguita è riportata nella sezione "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 utilizzando Touch ID, visualizzando l'origine che richiede l'autenticazione e il nome utente. In alto a destra nella finestra di dialogo è presente un pulsante con l'etichetta "Annulla".
. Finestra di dialogo di verifica dell'utente sul portachiavi iCloud su macOS.
di Gemini Advanced.
.
. 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.
Finestra di dialogo di verifica dell'utente su Chrome per Android.

Come vengono convalidati UP e UV sul server

I flag booleani di presenza dell'utente (UP) e di verifica dell'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. Finché la firma è valida, il server può considerare autentici i flag.

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, big-endian uint32), "ATTESTE CRED. "DATI" (lunghezza variabile, se presente) ed "EXTENSIONS" (lunghezza variabile se presente (CBOR). I "FLAGS" viene espansa per mostrare un elenco di potenziali flag, etichettati da sinistra a destra: "ED", "AT", "0", "BS", "BE", "UV", "0" e "UP".
. Campi 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 è true o false, a seconda del requisito.

Specificare il parametro userVerification

Secondo la specifica WebAuthn, la parte soggetta a limitazioni può richiedere una verifica dell'utente con un parametro userVerification sia nella creazione delle credenziali sia nell'asserzione. Accetta 'preferred', 'required' o 'discouraged', che significano rispettivamente:

  • 'preferred' (impostazione predefinita): è preferibile utilizzare un metodo di verifica dell'utente sul dispositivo, ma si può saltare questo passaggio se non è disponibile. La credenziale di risposta contiene un valore del flag UV true se è stata eseguita la verifica dell'utente e false se la verifica UV non è stata eseguita.
  • '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 restituisce sempre il flag UV impostato su true.
  • 'discouraged': è sconsigliato utilizzare un metodo di verifica dell'utente. Tuttavia, a seconda del dispositivo, la verifica dell'utente può essere comunque eseguita 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 la priorità all'esperienza utente piuttosto che alla protezione.

In alcuni casi, la verifica dell'utente è più complessa che protetta. Ad esempio, su macOS in cui Touch ID non è disponibile (perché il dispositivo non lo supporta, è disattivato o il dispositivo è in modalità clamshell), all'utente viene chiesto di inserire la password di sistema. Questo crea problemi e l'utente potrebbe abbandonare del tutto l'autenticazione. Se per te è più importante eliminare l'attrito, usa userVerification='preferred'.

Uno screenshot di una finestra di dialogo per le 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 un pulsante con l'etichetta "Annulla".
. Una finestra di dialogo per le 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 dell'utente viene saltata. Ad esempio, su macOS in cui Touch ID non è disponibile, chiede 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.

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

Quando utilizzare userVerification='required'

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

Uno svantaggio di questa opzione è che l'utente potrebbe riscontrare maggiori problemi durante l'accesso. Ad esempio, su macOS in cui Touch ID non è disponibile, all'utente viene chiesto di inserire la password di sistema.

Con userVerification='required', puoi fare in modo 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 effettui l'accesso. Sta a lui scegliere se richiedere la verifica dell'utente o renderlo facoltativo, a seconda di quanto critico il meccanismo di accesso di riserva influisce sul flusso dell'utente. Assicurati che il server controlli il flag UP e il flag UV per l'autenticazione utente tramite passkey.