Simpele (NL) uitleg van passkeysVoor de opslag van passkeys (aan jouw kant) heb je een soort wachtwoordmanager nodig (de meeste moderne wachtwoordmanagers ondersteunen passkeys). Als je niets ziet van een aparte wachtwoordmanager, komt dat doordat de noodzakelijke functionaliteit in jouw browser zit. De server moet natuurlijk ook passkeys ondersteunen.
Aanmaken nieuw account met passkey
1) Op passkey demo websites, zoals
https://webauthn.io, kun je gratis als test een passkey aanmaken. Vul een willekeurige naam in (jouw account wordt na 24 uur gewist door die site). Ik heb zojuist "
PietjePuk" gebruikt; kies iets anders.
2) Druk op "Register". Jouw browser genereert dan een nieuwe passkey. Die bestaat uit twee gigantisch grote willekeurige getallen die ik G1 en G2 noem (rekenkundig aan elkaar gerelateerd, maar niet te raden).
3) Vervolgens wordt G1 als een soort wachtwoord naar de website gestuurd. De webserver maakt dan een account (record in hun database) met daarin:
• als naam: "
PietjePuk";
• als "wachtwoord": G1.
4) Ook in jouw wachtwoordmanager wordt een record aangemaakt:
• de domeinnaam van de website met jouw account: "
webauthn.io";
• als naam: "
PietjePuk";
• als "wachtwoord": G2.
Nb. ook als je het account aanmaakt op een subdomein (zoals "
passkey.test.webauthn.io") wordt in het record de "eTLD+1" domeinnaam opgeslagen, nl. "
webauthn.io".
Inloggen met passkey
5) Als je
https://webauthn.io gesloten had, open deze dan opnieuw.
6) Je hoeft géén gebruikersnaam in te vullen! Als deze er nog staat mag je die tekst weghalen, laten staan mag ook.
7) Druk op "Authenticate" om in te loggen. Nb. het WebAuthn protocol vereist dat de server een geldig certificaat heeft en dat er van
https gebruik gemaakt wordt.
8) Jouw browser vraagt nu aan jouw wachtwoordmanager om te zoeken naar
alle passkey records met als domeinnaam "
webauthn.io". Dat gebeurt ook als je een subdomein zou hebben geopend, zoals de fictieve domeinnaan "
passkey.test.webauthn.io".
9) Als er niks in het naamveld op de voorpagina van
https://webauthn.io was ingevuld en je méér dan één account op die website hebt, vraagt jouw wachtwoordmanager (of browser) op
wélke van die accounts je wilt inloggen (als je slechts één account hebt, wordt deze vraag overgeslagen).
10) Als het goed is moet je nu met biometrie (vingerafdruk, gezichtsscan of eventueel ontgrendelcode) aantonen dat jij jij bent (in iOS en iPadOS zit nog steeds een kwetsbaarheid waardoor, onder specifieke onetandigheden, bijv. een dief of ienand aan wie je jouw iDevice uitleent, deze stap kan omzeilen).
11) De wachtwoordmanager stuurt nu de door jou gewenste gebruikersnaam naar de website.
12) De website zoekt jouw account-record erbij (zie stap 3). Als dat account niet (meer) bestaat op de server stuurt die server een foutmelding naar jouw browser. Als jouw account wel bestaat meldt de server dat stilletjes aan de browser.
13) De browser haalt de
volledige domeinnaam uit de adresbalk; in theorie zou dit "
passkey.test.webauthn.io" kunnen zijn. Tezamen met nog andere gegevens vult de browser een tijdelijk record en ondertekent dat digitaal met G2 (hoe digitaal ondertekenen werkt is te ingewikkeld om hier uit te leggen, zie
https://security.nl/posting/884482). Dat record stuurt de browser naar de server.
14) De server gebruikt G1 om de digitale handtekening te verifiëren. Als die klopt weet de server dat jij dezelfde PietjePuk moet zijn als degene die het account aanmaakte.
15) De server moet nog een check doen, nl. of jij (met jouw passkey) überhaupt wel op de werkelijke (sub-) domeinnaam mag inloggen. Met een passkey voor
google.com mag je namelijk beslist
niet op een
https://sites.google.com pagina kunnen inloggen, want die pagina's zijn van (potentieel kwaadaardige)
klanten van Google. In
https://github.com/w3ctag/design-reviews/issues/97#issuecomment-175766580 schrijft een Google-medewerker op welke subdomeinnamen je
wél mag inloggen (dat is al even geleden, het lijstje kan veranderd zijn).
16) Als alles OK is logt de server jou in, door een (1FA) session-cookie naar jouw browser te sturen.
Voordelen van passkeys
a) Het belangrijkste voordeel is
phishing resistance: je kunt met een passkey niet inloggen op een nepwebsite met een afwijkende domeinnaam, simpelweg omdat de wachtwoordmamager bij stap 8 geen record kan vinden (als je een passkey voor
lidl.be zou hebben, en je probeert in te loggen op
lîdl.be/login, dan lukt dat niet - wat je ook probeert).
b) De getallen G1 en G2 (uniek voor elke passkey) zijn te vergelijken met ongebruikelijk lange random, niet te raden, wachtwoorden.
c) De rest van de vaak geclaimde voordelen van passkeys, zoals "asymmetrische encryptie", zijn marketing bla bla. Het session-cookie dat je ontvangt vormt nog steeds een enorm zwakke schakel in de keten. Daarnaast kun je bijna altijd op alternatieve wijze inloggen (zonder passkey, bijv. als je die onverhoopt kwijtraakt), en kun je dus op een nepsite worden overgehaald om dat te doen. Dat een inbreker op de server er niets aan heeft als hij G1 in handen krijgt, klopt. Maar dat geldt ook als je voor elk account zelf een uniek wachtwoord gebruikt.
Indien een inbreker toegang krijgt tot een account database op een server, kan hij
zijn passkey (zijn G1) toevoegen aan jouw account, of jouw G1 door de zijne vervangen.
Nadelen van passkeys
d) Het is ondoorzichtige technologie (net als TOTP MFA/2FA) waardoor het risico op het kwijtraken van (toegang tot) de database van de wachtwoordmanager groot is, met multiple account lockouts als gevolg. Dit is vooral een risico als je de in Android en iOS/iPadOS ingebouwde wachtwoord+passkeymanagers gebruikt, waar je zelf nauwelijks of niet backups van kunt maken.
e) Google's passkey manager is cloud based. Het is doodsimpel om per ongeluk die database te wissen (notabene als je instructies van Google volgt). Google claimt zelf niet bij jouw passkeys te kunnen, maar dat is een leugen. Zie
https://seclists.org/fulldisclosure/2024/Feb/15.
f) Ik schreef het eerder: onder bepaalde omstandigheden vragen iOS en iPadOS niet om lokale authenticatie om passkeys (en wachtwoorden) uit (wat eerder de iCloud Keychain werd genoemd) te ontsluiten; zie
https://todon.nl/@ErikvanStraten/115658045799601168.
g) Als je op een website achter een TLS-MitM proxyserver (zoals van Cloudflare en Fastly) inlogt, kunnen beheerders van zo'n proxyserver jouw (ook met passkeys of Yubikeys beveiligde) accounts kapen. De domeinnaam verwijst dan naar de proxyserver waar jouw browser een https ("E2EE") verbinding mee heeft - dus géén E2EE met de gesuggereerde server.
h) Indien een nepsite, na het ongeautoriseerd wijzigen van een DNS-record of middels een BGP-hijack, (in no time) een geldig https servercertificaat verkrijgt, is een AitM aanval mogelijk waar passkeys en FIDO2 hardware keys jou niet tegen beschermen.
i) Als bijv. jouw telefoon (of FIDO2 hardware key) gestolen wordt en de dief erin slaagt om jouw biometrie te faken (zie ook f) bestaat er geen mechanisme om in één keer al jouw passkeys in te trekken (ook voor wachtwoorden bestaat dit niet, maar zoiets had natuurlijk in WebAuthn kunnen worden geïmplementeerd).
j) Last but not least: passkeys beschermen je
niet bij het toevoegen of vernieuwen van een passkey voor een bestaand account. Als je een phishingbericht krijgt waarin staat dat je een (nieuwe) passkey moet aanmaken op bijvoorbeeld
https://coinbase.passkeysetup•com
(de laatste punt heb ik door • vervangen), moet je ongetwijfeld inloggen op de oude manier. In de gegenereerde passkey zijn de criminelen niet geïnteresseerd, zij hebben nu op de oude manier toegang tot jouw account verkregen.
In 2023 schreef ik
https://www.security.nl/posting/798699/Passkeys+voor+leken.
Shortlink naar deze reactie:
https://security.nl/posting/929755.
SVP niet deze hele reactie quoten!