Starke Authentifizierung mit WebAuthn aktivieren

Das Problem

Phishing ist das größte Sicherheitsproblem im Web: 81% der Kontoverstöße im letzten Jahr, die mit Hacking zusammenhängen, nutzten schwache oder gestohlene Passwörter. Die gesamte Branche hat sich auf dieses Problem durch die Multi-Faktor-Authentifizierung geäußert. Allerdings sind Implementierungen fragmentiert und die meisten eignen sich immer noch nicht angemessen auf Phishing. Wir arbeiten seit 2013 mit der FIDO Alliance und seit Kurzem auch mit dem W3C an der Implementierung eines standardisierten, Phishing-resistenten Protokolls, das von jeder Webanwendung verwendet werden kann.

Was ist WebAuthn?

Die Web Authentication API gewährt Webanwendungen per User-Agent vermittelten Zugriff auf Authenticatoren, häufig Hardware-Tokens, auf die über USB/BLE/NFC oder direkt in die Plattform integrierte Module aufgerufen wird, um Anmeldedaten mit öffentlichem Schlüssel auf Anwendungsebene (eTLD+k) zu generieren und zu fordern. Dies ermöglicht eine Vielzahl von Anwendungsfällen, z. B.:

  • Reibungsarme und Phishing-resistente Bestätigung in zwei Schritten (zur Verwendung mit einem Passwort).
  • Passwortlose, biometrische erneute Autorisierung.
  • Reibungslose und Phishing-resistente 2FA ohne Passwort (zur Verwendung für passwortlose Konten).

Die API wird voraussichtlich von den meisten gängigen Browsern implementiert werden. Sie soll sowohl die UI vereinfachen, wenn Sie Ihre Identität online überprüfen müssen, als auch Phishing erheblich reduzieren.

WebAuthn erweitert die Credential Management API und fügt einen neuen Anmeldedatentyp namens PublicKeyCredential hinzu. WebAuthn abstrahiert die Kommunikation zwischen dem Browser und einem Authenticator und ermöglicht dem Nutzer Folgendes:

  1. Erstellen und registrieren Sie Anmeldedaten für einen öffentlichen Schlüssel für eine Website.
  2. Authentifizieren Sie sich bei einer Website, indem Sie nachweisen, dass Sie den entsprechenden privaten Schlüssel besitzen.

Authenticators sind Geräte, die private/öffentliche Schlüsselpaare generieren und Einwilligungen einholen können. Die Einwilligung zum Signieren kann durch einfaches Tippen, ein erfolgreiches Lesen des Fingerabdrucks oder auf andere Weise erteilt werden, solange diese den FIDO2-Anforderungen entsprechen (für Authenticatoren gibt es von der FIDO Alliance ein Zertifizierungsprogramm). Authenticators können entweder in die Plattform integriert (z. B. Fingerabdruckscanner auf Smartphones) oder über USB, Bluetooth Low Energy (BLE) oder Nahfeldkommunikation (NFC) verbunden werden.

Funktionsweise

Schlüsselpaar erstellen und Nutzer registrieren

Wenn ein Nutzer Anmeldedaten auf einer Website registrieren möchte (von WebAuthn als "verlassende Partei" bezeichnet):

  1. Die vertrauende Partei erzeugt eine Herausforderung.
  2. Die vertrauende Partei bittet den Browser über die Credential Manager API, neue Anmeldedaten für die vertrauende Partei zu generieren und Gerätefunktionen anzugeben, z.B. ob das Gerät eine eigene Nutzerauthentifizierung (mit biometrischen Verfahren usw.) bietet.
  3. Nachdem der Authenticator die Nutzereinwilligung eingeholt hat, generiert er ein Schlüsselpaar und gibt den öffentlichen Schlüssel und die optionale signierte Attestierung an die Website zurück.
  4. Die Webanwendung leitet den öffentlichen Schlüssel an den Server weiter.
  5. Der Server speichert den öffentlichen Schlüssel in Verbindung mit der Nutzeridentität, um sich die Anmeldedaten für zukünftige Authentifizierungen zu merken.
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} ]
}});

Nutzer authentifizieren

Wenn für eine Website ein Nachweis erforderlich ist, dass sie mit dem richtigen Nutzer interagiert:

  1. Die vertrauende Partei generiert eine Identitätsbestätigung und stellt dem Browser eine Liste von Anmeldedaten bereit, die für den Nutzer registriert sind. Außerdem kann angegeben werden, wo die Anmeldedaten zu finden sind, z.B. auf einem lokalen integrierten Authenticator oder auf einem externen über USB, BLE usw.
  2. Der Browser fordert den Authenticator auf, die Identitätsbestätigung zu unterzeichnen.
  3. Wenn der Authenticator eines der angegebenen Anmeldedaten enthält, gibt er nach Erhalt der Nutzereinwilligung eine signierte Assertion an die Webanwendung zurück.
  4. Die Webanwendung leitet die signierte Assertion an den Server weiter, damit die vertrauende Partei sie prüfen kann.
  5. Nach der Bestätigung durch den Server gilt der Authentifizierungsvorgang als erfolgreich.
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",
}});

Testen Sie WebAuthn selbst unter https://webauthndemo.appspot.com/.

Wie geht es weiter?

Die Betaversion von Chrome 67 unterstützt navigator.credentials.get({publicKey: ...}) und navigator.credentials.create({publicKey:... }) und ermöglicht die Verwendung von U2F/CTAP 1-Authenticators über USB-Transport auf dem Computer.

In den kommenden Releases werden weitere Transporte wie BLE und NFC sowie das neuere Wireprotokoll CTAP 2 unterstützt. Wir arbeiten auch an fortgeschritteneren Abläufen, die durch CTAP 2 und WebAuthn aktiviert werden, wie PIN-geschützte Authenticatoren, die lokale Auswahl von Konten (anstatt einen Nutzernamen oder ein Passwort einzugeben) und die Fingerabdruckregistrierung.

Beachten Sie, dass Microsoft Edge auch die API unterstützt und Firefox ab Firefox 60 WebAuthn unterstützt.

Ressourcen

Wir arbeiten an einer ausführlicheren Dokumentation:

In der Sitzung "What’s new with sign-up and sign-in on the web" auf der Google I/O 2018 wurde WebAuthn behandelt.