Nutzerüberprüfung im Detail

In diesem Dokument wird erläutert, was userVerification in WebAuthn ist und welches Browserverhalten sich ergibt, wenn userVerification während der Erstellung oder Authentifizierung eines Passkeys angegeben wird.

Was ist „Nutzerbestätigung“ in WebAuthn?

Passkeys basieren auf der Public-Key-Kryptografie. Beim Erstellen eines Passkeys wird ein öffentliches und privates Schlüsselpaar generiert, der private Schlüssel wird vom Passkey-Anbieter gespeichert und der öffentliche Schlüssel zum Speichern an den Server der vertrauenden Partei (RP) zurückgegeben. Der Server kann einen Nutzer authentifizieren, indem er eine Signatur, die mit demselben Passkey signiert wurde, mit dem verknüpften öffentlichen Schlüssel überprüft. Das Flag „User Present“ (UP) auf einem öffentlichen Schlüsselnachweis beweist, dass während der Authentifizierung jemand mit dem Gerät interagiert hat.

Die Nutzerüberprüfung ist eine optionale Sicherheitsebene, mit der sichergestellt werden soll, dass bei der Authentifizierung die richtige Person anwesend war, nicht nur eine beliebige Person, wie bei der Nutzerpräsenz. Bei Smartphones erfolgt dies in der Regel mithilfe der Displaysperre, entweder biometrische Daten oder eine PIN oder ein Passwort. Mit dem Flag „UV“, das bei der Registrierung und Authentifizierung des Passkeys in den Authentifizierungsdaten zurückgegeben wird, wird angezeigt, ob die Nutzerbestätigung durchgeführt wurde.

Screenshot eines Dialogfelds zur Nutzerbestätigung im iCloud-Schlüsselbund unter macOS. Im Dialogfeld wird der Nutzer aufgefordert, sich mit Touch ID anzumelden. Dabei werden der Ursprung, der die Authentifizierung anfordert, und der Nutzername angezeigt. Oben rechts im Dialogfeld befindet sich eine Schaltfläche mit der Bezeichnung „Abbrechen“.
Dialogfeld für die Nutzerbestätigung im iCloud-Schlüsselbund unter macOS.
Screenshot eines Dialogfelds zur Nutzerbestätigung in Chrome für Android Im Dialogfeld wird der Nutzer aufgefordert, seine Identität per Gesichtserkennung oder Fingerabdruckerkennung zu bestätigen. Außerdem wird die Quelle angezeigt, von der die Authentifizierung angefordert wird. Links unten können Sie die Bestätigung per PIN auswählen.
Dialogfeld zur Nutzerbestätigung in Chrome für Android.

So werden UP und UV auf dem Server validiert

Die booleschen Flags „User Presence“ (UP) und „User Verified“ (UV) werden dem Server im Datenfeld des Authenticators signalisiert. Während der Authentifizierung kann der Inhalt des Datenfelds des Authenticators durch Überprüfung der Signatur mit dem gespeicherten öffentlichen Schlüssel validiert werden. Solange die Signatur gültig ist, kann der Server die Flags als echt betrachten.

Darstellung der Authentifizierungsdatenstruktur. Von links nach rechts lautet jeder Abschnitt der Datenstruktur „RP ID HASH“ (32 Byte), „FLAGS“ (1 Byte), „COUNTER“ (4 Byte, Big-Endian-uint32), „ATTESTE CRED. „DATA“ (variable Länge, falls vorhanden) und „EXTENSIONS“ (variable Länge, falls vorhanden (CBOR)). Der Bereich „FLAGS“ (FLAGS) wird maximiert, um eine Liste potenzieller Flags anzuzeigen, die von links nach rechts beschriftet sind: „ED“, „AT“, „0“, „BS“, „BE“, „UV“, „0“ und „UP“.
Authenticator-Datenfelder in Anmeldedaten mit öffentlichem Schlüssel.

Bei der Registrierung und Authentifizierung von Passkeys sollte der Server prüfen, ob das UP-Flag true ist und ob das UV-Flag true oder false ist, je nach Anforderung.

Parameter userVerification angeben

Gemäß der WebAuthn-Spezifikation kann der RP sowohl bei der Erstellung als auch bei der Bestätigung von Anmeldedaten eine Nutzerbestätigung mit einem userVerification-Parameter anfordern. Es werden 'preferred', 'required' oder 'discouraged' akzeptiert, was Folgendes bedeutet:

  • 'preferred' (Standardeinstellung): Die Verwendung einer Nutzerbestätigungsmethode auf dem Gerät ist bevorzugt, kann aber übersprungen werden, wenn sie nicht verfügbar ist. Die Anmeldedaten in der Antwort enthalten den Wert „true“, wenn die Nutzerüberprüfung durchgeführt wurde, und „false“, wenn die Nutzerüberprüfung nicht durchgeführt wurde.
  • 'required': Es muss eine auf dem Gerät verfügbare Bestätigungsmethode für Nutzer aufgerufen werden. Ist keine verfügbar, schlägt die Anfrage lokal fehl. Das bedeutet, dass die Anmeldedaten der Antwort immer mit dem UV-Flag zurückgegeben werden, das auf true gesetzt ist.
  • 'discouraged': Die Verwendung einer Nutzerbestätigungsmethode wird nicht empfohlen. Je nach Gerät kann die Nutzerbestätigung jedoch trotzdem durchgeführt werden und die UV-Markierung kann true oder false enthalten.

Beispielcode zum Erstellen eines Passkeys:

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

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

Beispielcode für die Passkey-Authentifizierung:

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

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

Welche Option sollten Sie für userVerification auswählen?

Welchen userVerification-Wert Sie verwenden sollten, hängt von den Anwendungsanforderungen und der Nutzerfreundlichkeit ab.

Verwendung von userVerification='preferred'

Verwenden Sie userVerification='preferred', wenn Sie die Nutzerfreundlichkeit über den Schutz stellen.

Es gibt Umgebungen, in denen die Nutzerbestätigung mehr Aufwand als Schutz bedeutet. Wenn Touch ID beispielsweise unter macOS nicht verfügbar ist (weil das Gerät sie nicht unterstützt, sie deaktiviert ist oder sich das Gerät im Clamshell-Modus befindet), wird der Nutzer stattdessen aufgefordert, sein Systempasswort einzugeben. Das führt zu Problemen und der Nutzer kann die Authentifizierung ganz abbrechen. Wenn Sie die Abläufe möglichst reibungslos gestalten möchten, verwenden Sie userVerification='preferred'.

Ein Screenshot eines Passkey-Dialogfelds unter macOS, das angezeigt wird, wenn Touch ID nicht verfügbar ist. Das Dialogfeld enthält Informationen wie den Ursprung, der die Authentifizierung anfordert, sowie den Nutzernamen. Rechts oben im Dialogfeld befindet sich die Schaltfläche „Abbrechen“.
Ein Passkey-Dialogfeld, das unter macOS angezeigt wird, wenn Touch ID nicht verfügbar ist.

Bei userVerification='preferred' ist das UV-Flag true, wenn die Nutzerbestätigung erfolgreich durchgeführt wurde, und false, wenn die Nutzerbestätigung übersprungen wurde. Unter macOS, wo Touch ID nicht verfügbar ist, wird der Nutzer beispielsweise aufgefordert, auf eine Schaltfläche zu klicken, um die Nutzerbestätigung zu überspringen. Die Public-Key-Anmeldedaten enthalten dann das UV-Flag false.

Die UV-Markierung kann dann ein Signal für Ihre Risikoanalyse sein. Wenn der Anmeldeversuch aufgrund anderer Faktoren riskant erscheint, sollten Sie dem Nutzer zusätzliche Anmeldebestätigungen vorlegen, wenn die Nutzerbestätigung nicht durchgeführt wurde.

Verwendung von userVerification='required'

Verwenden Sie userVerification='required', wenn Sie der Meinung sind, dass sowohl UP als auch UV unbedingt erforderlich sind.

Ein Nachteil dieser Option ist, dass die Anmeldung für Nutzer möglicherweise etwas umständlicher ist. Unter macOS, wo Touch ID nicht verfügbar ist, wird der Nutzer beispielsweise aufgefordert, sein Systempasswort einzugeben.

Mit userVerification='required' können Sie dafür sorgen, dass die Nutzerüberprüfung auf dem Gerät durchgeführt wird. Der Server muss prüfen, ob das UV-Flag true ist.

Fazit

Mithilfe der Nutzerbestätigung können Parteien, die Passkeys verwenden, die Wahrscheinlichkeit einschätzen, dass sich der Geräteinhaber anmeldet. Sie können selbst entscheiden, ob eine Nutzerbestätigung erforderlich ist oder ob sie optional sein soll, je nachdem, wie wichtig der Fallback-Anmeldemechanismus den Ablauf für den Nutzer beeinflusst. Der Server muss das UP- und UV-Flag für die Passkey-Nutzerauthentifizierung prüfen.