Sterke authenticatie inschakelen met WebAuthn

Het probleem

Phishing is het grootste beveiligingsprobleem op internet: bij 81% van de hackgerelateerde accountinbreuken vorig jaar werd gebruik gemaakt van zwakke of gestolen wachtwoorden. Het collectieve antwoord van de industrie op dit probleem is multi-factor authenticatie, maar de implementaties zijn gefragmenteerd en de meeste pakken phishing nog steeds niet adequaat aan. We werken sinds 2013 samen met de FIDO Alliance en, meer recentelijk, met het W3C om een ​​gestandaardiseerd phishing-bestendig protocol te implementeren dat door elke webapplicatie kan worden gebruikt.

Wat is WebAuthn?

De Web Authentication API geeft webapplicaties user-agent-gemedieerde toegang tot authenticators – vaak hardwaretokens die toegankelijk zijn via USB/BLE/NFC of modules die rechtstreeks in het platform zijn ingebouwd – met het oog op het genereren en uitdagen van applicatiegerichte (eTLD+k ) referenties met een openbare sleutel. Dit maakt een verscheidenheid aan gebruiksscenario's mogelijk, zoals:

  • Lage wrijving en phishing-bestendige 2FA (te gebruiken in combinatie met een wachtwoord).
  • Wachtwoordloze, op biometrie gebaseerde herautorisatie.
  • Lage wrijving en phishing-bestendige 2FA zonder wachtwoord (te gebruiken voor wachtwoordloze accounts).

De API ligt op schema om door de meeste grote browsers te worden geïmplementeerd en is bedoeld om de gebruikersinterface te vereenvoudigen die u tegenkomt wanneer u uw identiteit online moet bewijzen, en om phishing aanzienlijk te verminderen.

WebAuthn breidt de Credential Management API uit en voegt een nieuw referentietype toe met de naam PublicKeyCredential . WebAuthn abstraheert de communicatie tussen de browser en een authenticator en stelt een gebruiker in staat om:

  1. Maak en registreer een publieke sleutelreferentie voor een website.
  2. Authenticeer u op een website door te bewijzen dat u over de bijbehorende privésleutel beschikt.

Authenticatoren zijn apparaten die private/publieke sleutelparen kunnen genereren en toestemming kunnen verkrijgen. Toestemming voor ondertekening kan worden verleend met een simpele tik, het succesvol lezen van een vingerafdruk of via andere methoden, zolang deze voldoen aan de FIDO2-vereisten (er is een certificeringsprogramma voor authenticatoren door de FIDO Alliance). Authenticatoren kunnen in het platform worden ingebouwd (zoals vingerafdrukscanners op smartphones) of worden aangesloten via USB, Bluetooth Low Energy (BLE) of Near-Field Communication (NFC).

Hoe het werkt

Een sleutelpaar aanmaken en een gebruiker registreren

Wanneer een gebruiker een inloggegevens voor een website wil registreren (door WebAuthn de "vertrouwende partij" genoemd):

  1. De vertrouwende partij genereert een uitdaging.
  2. De vertrouwende partij vraagt ​​de browser, via de Credential Manager API, om een ​​nieuwe referentie voor de vertrouwende partij te genereren, waarbij de apparaatmogelijkheden worden gespecificeerd, bijvoorbeeld of het apparaat zijn eigen gebruikersauthenticatie biedt (met biometrie, enz.).
  3. Nadat de authenticator toestemming van de gebruiker heeft verkregen, genereert de authenticator een sleutelpaar en stuurt de openbare sleutel en de optionele ondertekende attest terug naar de website.
  4. De webapp stuurt de publieke sleutel door naar de server.
  5. De server slaat de openbare sleutel op, gekoppeld aan de identiteit van de gebruiker, om de referenties te onthouden voor toekomstige authenticaties.
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} ]
}});

Authenticatie van een gebruiker

Wanneer een website bewijs moet verkrijgen dat deze met de juiste gebruiker communiceert:

  1. De vertrouwende partij genereert een uitdaging en levert de browser een lijst met inloggegevens die voor de gebruiker zijn geregistreerd. Het kan ook aangeven waar de referentie moet worden gezocht, bijvoorbeeld op een lokale ingebouwde authenticator, of op een externe via USB, BLE, enz.
  2. De browser vraagt ​​de authenticator om de uitdaging te ondertekenen.
  3. Als de authenticator een van de opgegeven inloggegevens bevat, retourneert de authenticator een ondertekende bewering naar de web-app nadat hij toestemming van de gebruiker heeft ontvangen.
  4. De webapp stuurt de ondertekende bewering door naar de server, zodat de vertrouwende partij deze kan verifiëren.
  5. Eenmaal geverifieerd door de server, wordt de authenticatiestroom als succesvol beschouwd.
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",
}});

Probeer WebAuthn zelf op https://webauthndemo.appspot.com/ .

Wat staat ons te wachten?

Chrome 67 bèta wordt geleverd met ondersteuning voor navigator.credentials.get({publicKey: ...}) en navigator.credentials.create({publicKey:... }) en maakt het gebruik van U2F/CTAP 1-authenticators via USB-transport op desktop mogelijk.

Aankomende releases zullen ondersteuning toevoegen voor meer transporten zoals BLE en NFC en het nieuwere CTAP 2-draads protocol. We werken ook aan geavanceerdere stromen die mogelijk worden gemaakt door CTAP 2 en WebAuthn, zoals met pincode beveiligde authenticators, lokale selectie van accounts (in plaats van het typen van een gebruikersnaam of wachtwoord) en registratie van vingerafdrukken.

Merk op dat Microsoft Edge ook de API ondersteunt en dat Firefox WebAuthn ondersteunt vanaf Firefox 60 .

Bronnen

We werken aan meer gedetailleerde documentatie:

De sessie 'Wat is er nieuw bij aanmelden en inloggen op internet' op Google I/O 2018 ging over WebAuthn.