Kontakta supporten

Vi svarar via e-post, oftast inom två dagar.

Google reCAPTCHA kontrollerar det här inskicket mot missbruk; data skickas till Google. Skriptet laddas först när formuläret öppnas.

← Alla inlägg

Vad ett lösenord kostar på blygsam hårdvara

Statistiksidor här kan skyddas med ett lösenord. Att hasha lösenordet är den enda åtgärden i tjänsten som ska vara långsam — det är det som gör en stulen hash dyr att angripa. Frågan är hur långsam, på den här hårdvaran.

Uppmätt på maskinen som kör den här webbplatsen, PHP 8:

PASSWORD_DEFAULT560 ms(motsvarar kostnad 12)
kostnad 12595 ms
kostnad 11277 ms
kostnad 10138 ms
kostnad 10138 mskostnad 11277 mskostnad 12595 msPASSWORD_DEFAULT

bcrypts kostnadsparameter är en exponent: varje steg fördubblar arbetet. Mätningarna visar exakt den fördubblingen, vilket är ett gott tecken på att inget annat stör.

Varför standardvärdet är fel val här

PHP höjde bcrypts standardkostnad från 10 till 12. På en vanlig server är det en rimlig uppgradering — det handlar om några tiotal millisekunder. På blygsam hårdvara är det över en halv sekund ren CPU-tid, på en maskin som samtidigt ritar räknarbilder åt alla andra.

En halv sekund per inloggning är illa i sig. Det är värre som inbjudan: vem som helst kan anropa inloggningens endpoint, och varje anrop förbrukar 560 ms av den CPU som betjänar hela webbplatsen. Det gör lösenordskontrollen till den billigaste angreppsytan för överbelastning som finns.

Därför är kostnaden låst till 10 i stället för att lämnas åt standardvärdet. Det är medvetet svagare än vad PHP nu väljer, och det ska sägas rakt ut i stället för att gömmas undan: en hash med kostnad 10 är fyra gånger billigare att angripa än en hash med kostnad 12. Det som väger upp det är vad lösenordet faktiskt skyddar — synligheten för en sida med besöksantal, inte ett konto, inte pengar, inte en identitet. Det finns inget bakom det att ta över.

Det som är lätt att missa

PASSWORD_DEFAULT är ett rörligt värde med avsikt. Kod som skrevs för flera år sedan och som använder det blir i tysthet långsammare med varje PHP-uppgradering — samma källkod, samma indata, flera gånger längre körtid. Det är det avsedda beteendet, och det är rätt för de flesta program.

Det är bara fel när maskinen inte klarar av det, och ingenting varnar när den inte gör det. Uppgraderingen lyckas, testerna går igenom, sidan fungerar fortfarande. Den tar bara en halv sekund längre, och ingen tittar på den siffran om man inte går in och mäter den.

Annons