Колко струва една парола на скромен хардуер
Статистическите страници тук могат да бъдат защитени с парола. Хеширането на тази парола е единствената операция в тази услуга, която трябва да е бавна — именно това прави атаката срещу откраднат хеш скъпа. Въпросът е колко бавна, на този хардуер.
Измерено на машината, на която работи този сайт, PHP 8:
PASSWORD_DEFAULT | 560 ms | (съответства на cost 12) |
| cost 12 | 595 ms | |
| cost 11 | 277 ms | |
| cost 10 | 138 ms |
Параметърът cost на bcrypt е степенен показател: всяка стъпка удвоява работата. Измерванията показват точно това удвояване, което е добър знак, че нищо друго не се намесва.
Защо стойността по подразбиране е грешен избор тук
PHP повиши стойността по подразбиране на cost за bcrypt от 10 на 12. На сървър с мощността на настолен компютър това е разумно подобрение — става дума за няколко десетки милисекунди. На скромен хардуер това е над половин секунда чисто процесорно време, на машина, която в същото време рисува изображенията на броячите и за всички останали.
Половин секунда за всяко влизане е лошо само по себе си. Още по-лошо е като покана: всеки може да извика крайната точка за влизане, а всяко извикване изразходва 560 ms от процесора, който обслужва целия сайт. Така проверката на паролата се превръща в най-евтината налична повърхност за атака за отказ на услуга.
Затова cost е фиксиран на 10, вместо да се остави стойността по подразбиране. Това умишлено е по-слабо от онова, което PHP избира сега, и трябва да се каже ясно, а не да се скрива: хеш с cost 10 е четири пъти по-евтин за атака от хеш с cost 12. Това се компенсира от онова, което паролата всъщност защитава — видимостта на една страница с броя на посещенията, а не акаунт, не пари, не самоличност. Зад нея няма нищо, което да бъде превзето.
Частта, която лесно се пропуска
PASSWORD_DEFAULT по замисъл е променлива стойност. Код, написан преди години, който я използва, тихо ще става по-бавен с всяко обновяване на PHP — същият изходен код, същите входни данни, многократно по-дълго изпълнение. Това е предвиденото поведение и то е правилно за по-голямата част от софтуера.
Грешно е само когато машината не може да го поеме, а нищо не предупреждава, когато не може. Обновяването минава успешно, тестовете минават, страницата продължава да работи. Просто отнема половин секунда повече и никой не поглежда това число, освен ако не отиде да го измери.