Contact met ondersteuning

Wij antwoorden per e-mail, meestal binnen twee dagen.

Google reCAPTCHA controleert deze inzending op misbruik; daarbij worden gegevens naar Google gestuurd. Het script laadt pas wanneer dit formulier wordt geopend.

← Alle berichten

Wat een wachtwoord kost op bescheiden hardware

Statistiekpagina's hier kunnen met een wachtwoord worden beschermd. Dat wachtwoord hashen is de ene bewerking in deze dienst die traag hoort te zijn — dat is wat een gestolen hash duur maakt om aan te vallen. De vraag is hoe traag, op deze hardware.

Gemeten op de machine die deze site draait, PHP 8:

PASSWORD_DEFAULT560 ms(komt uit op cost 12)
cost 12595 ms
cost 11277 ms
cost 10138 ms
cost 10138 mscost 11277 mscost 12595 msPASSWORD_DEFAULT

De cost-parameter van bcrypt is een exponent: elke stap verdubbelt het werk. De metingen laten precies die verdubbeling zien, en dat is een goed teken dat er niets anders tussenzit.

Waarom de standaard hier de verkeerde keuze is

PHP heeft de standaardkosten van bcrypt van 10 naar 12 getild. Op een bureaubladserver is dat een verstandige verbetering — het gaat om enkele tientallen milliseconden. Op bescheiden hardware is het ruim een halve seconde pure processortijd, op een machine die tegelijk voor alle anderen tellerafbeeldingen tekent.

Een halve seconde per aanmelding is op zichzelf al slecht. Het is erger als uitnodiging: iedereen kan het aanmeldpunt aanroepen, en elke aanroep besteedt 560 ms van de processor die de hele site bedient. Daarmee wordt wachtwoordcontrole het goedkoopste aanvalsoppervlak voor een denial of service dat er is.

De kosten staan daarom vastgepind op 10 in plaats van aan de standaard overgelaten. Dat is met opzet zwakker dan wat PHP nu kiest, en dat hoort duidelijk gezegd te worden in plaats van weggemoffeld: een hash met cost 10 is vier keer goedkoper aan te vallen dan een met cost 12. Wat dat terugkoopt, is wat het wachtwoord werkelijk beschermt — de zichtbaarheid van een pagina met bezoekcijfers, geen account, geen geld, geen identiteit. Er zit niets achter om over te nemen.

Het deel dat makkelijk te missen is

PASSWORD_DEFAULT is met opzet een bewegende waarde. Code die er jaren geleden mee geschreven is, wordt bij elke PHP-verbetering stilletjes trager — dezelfde bron, dezelfde invoer, een veelvoud aan looptijd. Dat is het bedoelde gedrag, en voor de meeste software klopt het.

Het is alleen fout wanneer de machine het niet kan opvangen, en niets waarschuwt wanneer dat niet lukt. De verbetering slaagt, de tests komen door, de pagina werkt nog. Hij doet er alleen een halve seconde langer over, en niemand kijkt naar dat getal tenzij hij het gaat meten.

Advertentie