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_DEFAULT | 560 ms | (motsvarar kostnad 12) |
| kostnad 12 | 595 ms | |
| kostnad 11 | 277 ms | |
| kostnad 10 | 138 ms |
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.