Čo stojí heslo na skromnom hardvéri
V tomto článku
Tunajšie stránky so štatistikami možno chrániť heslom. Hashovanie tohto hesla je jediná operácia v tejto službe, ktorá má zámerne byť pomalá — práve to predražuje útok na ukradnutý hash. Otázkou je, ako pomalá na tomto hardvéri.
Zmerané na stroji, na ktorom beží tento web, PHP 8:
PASSWORD_DEFAULT | 560 ms | (zodpovedá náročnosti 12) |
| náročnosť 12 | 595 ms | |
| náročnosť 11 | 277 ms | |
| náročnosť 10 | 138 ms |
Parameter náročnosti algoritmu bcrypt je exponent: každý krok zdvojnásobuje prácu. Merania ukazujú presne toto zdvojnásobenie, čo je dobrým znamením, že do toho nič iné nezasahuje.
Prečo je tu predvolená hodnota nesprávnou voľbou
PHP zvýšil predvolenú náročnosť algoritmu bcrypt z 10 na 12. Na serveri s výkonom bežného počítača je to rozumné vylepšenie — ide o niekoľko desiatok milisekúnd. Na skromnom hardvéri je to viac než pol sekundy čistého času procesora, na stroji, ktorý zároveň vykresľuje obrázky počítadiel pre všetkých ostatných.
Pol sekundy na prihlásenie je zlé samo osebe. Ešte horšie je to ako pozvánka: prihlasovací koncový bod môže zavolať ktokoľvek a každé zavolanie minie 560 ms procesora, ktorý obsluhuje celý web. Overovanie hesla sa tak mení na najlacnejšiu dostupnú plochu pre útok odmietnutím služby.
Náročnosť je preto pevne nastavená na 10 namiesto ponechania predvolenej hodnoty. Je to zámerne slabšie, než dnes vyberá PHP, a malo by to zaznieť jasne namiesto ukrývania: útok na hash s náročnosťou 10 je štyrikrát lacnejší než na hash s náročnosťou 12. Vyvažuje to, čo heslo naozaj chráni — viditeľnosť stránky s počtami návštev, nie účet, peniaze ani identitu. Nie je za ním nič, čo by sa dalo prevziať.
Časť, ktorú možno ľahko prehliadnuť
PASSWORD_DEFAULT je zámerne pohyblivá hodnota. Kód napísaný pred rokmi, ktorý ju používa, sa bude pri každej aktualizácii PHP potichu spomaľovať — rovnaký zdroj, rovnaký vstup, niekoľkonásobný čas behu. Je to zamýšľané správanie a pre väčšinu softvéru správne.
Nesprávne je iba vtedy, keď to stroj nezvláda, a nič nevaruje, keď to nezvláda. Aktualizácia sa podarí, testy prejdú, stránka stále funguje. Len trvá o pol sekundy dlhšie a nikto sa na toto číslo nepozrie, pokiaľ ho nejde zmerať.