Šta lozinka košta na skromnom hardveru
U ovom članku
Stranice sa statistikom ovde mogu biti zaštićene lozinkom. Heširanje te lozinke je jedina operacija u ovoj usluzi koja treba da bude spora — zato je ukradeni heš skup za napad. Pitanje je koliko spora, na ovom hardveru.
Izmereno na mašini na kojoj radi ovaj sajt, PHP 8:
PASSWORD_DEFAULT | 560 ms | (svodi se na cost 12) |
| cost 12 | 595 ms | |
| cost 11 | 277 ms | |
| cost 10 | 138 ms |
Parametar cost kod bcrypta je eksponent: svaki korak udvostručuje posao. Merenja pokazuju upravo to udvostručavanje, što je dobar znak da ništa drugo ne smeta.
Zašto je podrazumevana vrednost ovde pogrešan izbor
PHP je podrazumevani cost bcrypta podigao sa 10 na 12. Na desktop serveru to je razumno unapređenje — nekoliko desetina milisekundi. Na skromnom hardveru to je preko pola sekunde čistog procesora, na mašini koja istovremeno crta slike brojača za sve ostale.
Pola sekunde po prijavi je loše samo po sebi. Gore je kao poziv: svako može da pozove krajnju tačku za prijavu, a svaki poziv troši 560 ms procesora koji služi ceo sajt. To proveru lozinke pretvara u najjeftiniju površinu za uskraćivanje usluge.
Zato je cost zakucan na 10 umesto da se prepusti podrazumevanom. To je namerno slabije od onoga što PHP sada bira i treba to jasno reći, a ne zakopati: heš sa cost 10 četiri puta je jeftiniji za napad od heša sa cost 12. Ono što to nadoknađuje jeste šta lozinka zaista štiti — vidljivost stranice sa brojem poseta, a ne nalog, ne novac, ne identitet. Iza nje nema ničega što bi se moglo preuzeti.
Deo koji se lako previdi
PASSWORD_DEFAULT je pokretna vrednost po dizajnu. Kod napisan pre godina koji je koristi tiho će postajati sporiji sa svakom nadogradnjom PHP-a — isti izvor, isti ulaz, nekoliko puta duže izvršavanje. To je predviđeno ponašanje i ispravno je za većinu softvera.
Pogrešno je samo kada mašina ne može da ga apsorbuje, a ništa ne upozorava kada ne može. Nadogradnja uspe, testovi prolaze, stranica i dalje radi. Samo traje pola sekunde duže, a taj broj niko ne gleda dok ga ne izmeri.