Hoe lang duurt het echt om je wachtwoord te kraken

Gepubliceerd op door David Carrero

Als een site je vertelt dat je wachtwoord drie miljoen jaar nodig heeft om gekraakt te worden, laat hij het belangrijkste deel van de zin weg. De juiste vraag is niet hoe lang het duurt. Het is hoe lang tegen wát.

En dat waartegen bepaal jij niet. Dat werd bepaald door een ontwikkelaar van de webshop waar je in 2019 sneakers kocht, op het moment dat hij koos hoe hij jouw wachtwoord in zijn database zou bewaren. Jij typte op beide sites exact dezelfde twintig tekens in. Op de ene houdt het eeuwen stand, op de andere valt het nog voor de lunch.

Het getal dat in de som ontbreekt

Een brute-force-aanval is platte rekenkunde: het aantal kandidaten dat je moet proberen, gedeeld door het aantal kandidaten dat je per seconde kúnt proberen. De eerste factor hangt af van jouw wachtwoord — de lengte, het alfabet, of het al dan niet in een woordenboek staat. De tweede heeft helemaal niets met jou te maken.

Die tweede factor hangt van twee dingen af: de hardware van de aanvaller en vooral de functie waarmee de site jouw wachtwoord omzette in de brij die in zijn gebruikerstabel staat. Die functie heet een hash, en ze kosten niet allemaal evenveel rekenwerk.

MD5 en SHA-1 zijn ontworpen om snel te zijn. Dat is een deugd: het zijn hashfuncties voor algemeen gebruik, bedoeld om berichten samen te vatten en integriteit te controleren, en daarbij wil je een gigabyte verwerken zonder dat je ondertussen koffie kunt zetten. Zodra iemand ze gebruikt om wachtwoorden op te slaan, wordt die deugd het probleem. Een functie die jij miljoenen keren per seconde kunt berekenen, is een functie die de aanvaller ook miljoenen keren per seconde kan berekenen — en hij heeft grafische kaarten en een heel weekend.

bcrypt en Argon2 zijn met precies het omgekeerde doel ontworpen. Ze zijn expres traag, en — dit is het elegante deel — met instelbare traagheid. Niels Provos en David Mazières presenteerden bcrypt in 1999 met een titel die alles zegt: A Future-Adaptable Password Scheme. Het idee was dat de functie met de jaren duurder kon worden, in hetzelfde tempo waarin hardware goedkoper werd. Argon2, dat in 2015 de Password Hashing Competition won, deed er nog een schepje bovenop: het kost niet alleen tijd, het kost geheugen, en dat is nu net wat GPU’s met de minste vrolijkheid uitdelen.

Tussen een snelle hash en een goed geconfigureerde trage hash zit geen verschil in procenten. Er zitten ordes van grootte tussen. Veel.

De benchmarks bestaan, en ze zijn openbaar

Dit is geen speculatie. Hashcat, het gereedschap waarmee de halve wereld wachtwoorden kraakt — de goeden incluis —, heeft een benchmarkmodus die iedereen op zijn eigen machine kan draaien en die per algoritme meet hoe vaak per seconde het te berekenen valt. De gemeenschap publiceert die tabellen telkens als er een nieuwe GPU uitkomt.

Het interessante aan die tabellen is geen enkel concreet getal — dat veroudert sowieso met elke hardwaregeneratie — maar de afstand tussen de regels. Je sorteert de lijst op snelheid en ziet MD5 helemaal bovenaan, op zijn eigen planeet. Je scrollt door en door, en onderaan de tabel staan bcrypt en Argon2, met cijfers die er in de verste verte niet op lijken. Het is hetzelfde wachtwoord. Het is dezelfde GPU. Het enige wat veranderd is, is hoe de site besloot het te bewaren.

Daarom is “3 miljoen jaar” zonder erbij te zeggen tegen welke hash marketing, geen meting. Het is alsof je adverteert dat je auto er zes uur over doet zonder de bestemming te noemen.

Offline en online: twee werelden die elkaar niet raken

Er is nog een tweede onderscheid dat bijna niemand uitlegt en dat het resultaat net zo bruut verandert.

Bij een online-aanval probeert de aanvaller wachtwoorden op het inlogformulier, net als een gewone gebruiker. Het tempo wordt niet door zijn hardware bepaald, maar door de server. Er kan een limiet op het aantal pogingen zitten, een tijdelijke blokkade, een captcha, vertraging tussen verzoeken, alarmen zodra er duizend mislukkingen vanaf hetzelfde adres komen. Tegen een fatsoenlijk verdedigde site is een online-aanval traag, lawaaierig en behoorlijk dom. De rekensom valt zo slecht uit voor de aanvaller dat pure brute force nauwelijks nog geprobeerd wordt: men probeert de vier bekende wachtwoorden op miljoenen accounts, en dat is een ander spel.

Bij een offline-aanval heeft de aanvaller de dump van de database al. Die neemt hij mee naar huis. Daar is geen server, geen pogingenlimiet, niemand die meekijkt: daar zijn zijn grafische kaarten en zijn energierekening. Hij kan maandenlang proberen zonder dat iemand het merkt, en hij weet helemaal zelf wanneer hij raak heeft, gewoon door hashes te vergelijken. Hier bepaalt de hash alles, want de hash is letterlijk het enige wat hem afremt.

En laten we eerlijk zijn over de kansen: het offlinescenario is niet exotisch. Het is wat er gebeurt telkens als er een database uitlekt. Toen LinkedIn in 2012 de zijne kwijtraakte, liet de analyse van de gelekte dump zien dat de wachtwoorden waren opgeslagen met SHA-1 zonder salt: een snelle hash, zonder het ingrediënt dat het voorberekenen van tabellen onmogelijk maakt. Dat er zoveel en zo snel gekraakt werden, lag niet alleen aan gebruikers die slecht kozen. Het lag vooral aan een technische beslissing die geen enkele gebruiker ooit te zien kreeg.

Wat wij hier doen, en waarom we het zeggen

Onze checker gaat uit van 10¹² pogingen per seconde, offline, tegen een snelle hash. Het staat op de pagina zelf, onder het resultaat, en niet uit decoratieve transparantie: zonder dat gegeven betekent de tijd die je te zien krijgt niets.

Het is bewust het slechte geval. We nemen aan dat de database al gelekt is, dat de aanvaller serieuze hardware heeft, dat de site je wachtwoord op de slechtst denkbare redelijke manier bewaarde en dat hij bovendien je alfabet en je lengte kent. Gebruikte de site een goed geconfigureerde bcrypt, dan gaat het echte cijfer vele ordes van grootte omhoog en houdt je wachtwoord veel langer stand dan wij je vertellen.

We zitten liever aan die kant fout. Een checker die je feliciteert, feliciteert vooral zichzelf.

De ongemakkelijke conclusie

Je wachtwoord heeft geen kraaktijd. Het heeft een kraaktijd per site waarop je het gebruikt hebt, en die tijd wordt vastgelegd door mensen die je niet kent, volgens criteria die ze niet publiceren.

Daar volgen twee dingen uit, en het zijn de gebruikelijke. Ten eerste: omdat je de hash niet in de hand hebt, houd de entropie in de hand, want dat is de helft van de som die wél van jou is — daarom laat de generator je bits zien en geen vriendelijk percentage. Ten tweede, en dat is belangrijker: als elke site zijn eigen wachtwoord heeft, kan degene die het in MD5 opsloeg alleen dat ene wachtwoord weggeven.

Want de zwakste schakel is niet je wachtwoord. Het is de slechtste site waar je het ooit intypte.


Bronnen: openbare hashcat-benchmarks (hashcat -b), raadpleegbaar en reproduceerbaar · N. Provos en D. Mazières, «A Future-Adaptable Password Scheme», USENIX, 1999 · Password Hashing Competition, in 2015 gewonnen door Argon2 · het verklaarde dreigingsmodel van de checker van password.es: 10¹² pogingen/s, offline, snelle hash · het LinkedIn-lek van 2012: het bedrijf bevestigde de inbreuk, en het gebruik van SHA-1 zonder salt werd vastgesteld bij de analyse van de gepubliceerde dump.

← Terug naar de blog