Koliko lozinka košta na skromnom hardveru
O sadržaju i njegovoj provjeri
U ovom članku
Ovdašnje stranice statistike mogu se zaštititi lozinkom. Hashiranje te lozinke jedina je operacija ove usluge koja je namjerno spora — upravo zbog toga napad na ukradeni hash mnogo košta. Pitanje je koliko spora, na ovom hardveru.
Izmjereno na stroju na kojem radi ovo web-mjesto, PHP 8:
PASSWORD_DEFAULT | 560 ms | (odgovara trošku 12) |
| trošak 12 | 595 ms | |
| trošak 11 | 277 ms | |
| trošak 10 | 138 ms |
Parametar troška za bcrypt eksponent je: svaki korak udvostručuje posao. Mjerenja pokazuju upravo to udvostručenje, što je dobar znak da ništa drugo ne utječe na rezultat.
Zašto je zadana postavka ovdje pogrešan izbor
PHP je povećao zadani trošak za bcrypt s 10 na 12. Na poslužitelju snage stolnog računala to je razumna nadogradnja — nekoliko desetaka milisekundi. Na skromnom hardveru to je više od pola sekunde čistog procesorskog vremena, na stroju koji istodobno iscrtava i slike brojača za sve ostale.
Pola sekunde po prijavi loše je samo po sebi. Još je gore kao poziv: svatko može pozvati krajnju točku prijave i svaki poziv troši 560 ms procesora koji poslužuje cijelo web-mjesto. Time provjera lozinke postaje najjeftinija dostupna površina za napad uskraćivanjem usluge.
Zato je trošak fiksiran na 10 umjesto da ostane zadani. To je namjerno slabije od onoga što PHP sada bira i treba se jasno reći, a ne zakopati: napad na hash s troškom 10 četiri je puta jeftiniji od napada na hash s troškom 12. To nadoknađuje ono što lozinka zapravo štiti — vidljivost stranice s brojem posjeta, a ne račun, novac ili identitet. Iza nje nema ničega što bi se moglo preuzeti.
Dio koji je lako previdjeti
PASSWORD_DEFAULT po samoj je zamisli promjenjiva vrijednost. Kod napisan prije mnogo godina koji je koristi neprimjetno će se usporavati pri svakoj nadogradnji PHP-a — isti izvorni kod, isti ulazni podaci, višestruko trajanje izvršavanja. To je namjerno ponašanje i ispravno je za većinu softvera.
Pogrešno je samo kada stroj to ne može podnijeti, a ništa ne upozorava kada ne može. Nadogradnja uspije, testovi prođu, stranica i dalje radi. Samo joj treba pola sekunde više, a nitko ne gleda tu brojku ako je ne ode izmjeriti.