Mennyibe kerül egy jelszó szerény hardveren
Az itteni statisztikaoldalak jelszóval védhetők. Ennek a jelszónak a hash-elése a szolgáltatás egyetlen olyan művelete, amelynek lassúnak kell lennie — ettől lesz drága egy ellopott hash feltörése. A kérdés az, hogy mennyire lassúnak, ezen a hardveren.
Az ezt a weboldalt futtató gépen mérve, PHP 8 alatt:
PASSWORD_DEFAULT | 560 ms | (12-es költségnek felel meg) |
| 12-es költség | 595 ms | |
| 11-es költség | 277 ms | |
| 10-es költség | 138 ms |
A bcrypt költségparamétere kitevő: minden lépés megduplázza a munkát. A mérések pontosan ezt a duplázódást mutatják, ami jó jel arra, hogy semmi más nem zavar bele.
Miért rossz itt az alapértelmezés
A PHP a bcrypt alapértelmezett költségét 10-ről 12-re emelte. Egy átlagos szerveren ez észszerű fejlesztés — néhány tíz milliszekundumról van szó. Szerény hardveren viszont több mint fél másodpercnyi tiszta processzoridő, olyan gépen, amely közben mindenki más számára is rajzolja a számlálóképeket.
Bejelentkezésenként fél másodperc már önmagában is rossz. Még rosszabb, hogy felhívás a támadásra: a bejelentkezési végpontot bárki meghívhatja, és minden hívás 560 ms-ot költ el annak a processzornak az idejéből, amely az egész weboldalt kiszolgálja. Ez a jelszó-ellenőrzést a legolcsóbb elérhető felületté teszi egy szolgáltatásmegtagadásos támadáshoz.
Ezért a költséget 10-re rögzítettük, ahelyett hogy az alapértelmezésre hagynánk. Ez szándékosan gyengébb annál, amit a PHP most választ, és ezt nyíltan ki kell mondani, nem eldugni: egy 10-es költségű hash-t négyszer olcsóbb támadni, mint egy 12-est. Amit ezzel szemben nyerünk vissza, az abban rejlik, amit a jelszó valójában véd — egy látogatásszámokat mutató oldal láthatóságát, nem egy fiókot, nem pénzt, nem személyazonosságot. Nincs mögötte semmi, amit át lehetne venni.
A könnyen elsikló rész
PASSWORD_DEFAULT szándékosan változó érték. Az évekkel ezelőtt írt kód, amely ezt használja, minden PHP-frissítéssel csendben lassabb lesz — ugyanaz a forrás, ugyanaz a bemenet, többszörös futásidő. Ez a szándékolt viselkedés, és a legtöbb szoftvernél helyes is.
Csak akkor rossz, ha a gép nem bírja el, és erre semmi sem figyelmeztet. A frissítés sikeres, a tesztek lefutnak, az oldal továbbra is működik. Csak fél másodperccel tovább tart, és erre a számra senki sem néz rá, hacsak meg nem méri.