Връзка с поддръжката

Отговаряме по имейл, обикновено до два дни.

Google reCAPTCHA проверява това изпращане срещу злоупотреби; данни се изпращат към Google. Скриптът се зарежда само когато този формуляр бъде отворен.

← Всички публикации

Колко струва една парола на скромен хардуер

Статистическите страници тук могат да бъдат защитени с парола. Хеширането на тази парола е единствената операция в тази услуга, която трябва да е бавна — именно това прави атаката срещу откраднат хеш скъпа. Въпросът е колко бавна, на този хардуер.

Измерено на машината, на която работи този сайт, PHP 8:

PASSWORD_DEFAULT560 ms(съответства на cost 12)
cost 12595 ms
cost 11277 ms
cost 10138 ms
cost 10138 mscost 11277 mscost 12595 msPASSWORD_DEFAULT

Параметърът cost на bcrypt е степенен показател: всяка стъпка удвоява работата. Измерванията показват точно това удвояване, което е добър знак, че нищо друго не се намесва.

Защо стойността по подразбиране е грешен избор тук

PHP повиши стойността по подразбиране на cost за bcrypt от 10 на 12. На сървър с мощността на настолен компютър това е разумно подобрение — става дума за няколко десетки милисекунди. На скромен хардуер това е над половин секунда чисто процесорно време, на машина, която в същото време рисува изображенията на броячите и за всички останали.

Половин секунда за всяко влизане е лошо само по себе си. Още по-лошо е като покана: всеки може да извика крайната точка за влизане, а всяко извикване изразходва 560 ms от процесора, който обслужва целия сайт. Така проверката на паролата се превръща в най-евтината налична повърхност за атака за отказ на услуга.

Затова cost е фиксиран на 10, вместо да се остави стойността по подразбиране. Това умишлено е по-слабо от онова, което PHP избира сега, и трябва да се каже ясно, а не да се скрива: хеш с cost 10 е четири пъти по-евтин за атака от хеш с cost 12. Това се компенсира от онова, което паролата всъщност защитава — видимостта на една страница с броя на посещенията, а не акаунт, не пари, не самоличност. Зад нея няма нищо, което да бъде превзето.

Частта, която лесно се пропуска

PASSWORD_DEFAULT по замисъл е променлива стойност. Код, написан преди години, който я използва, тихо ще става по-бавен с всяко обновяване на PHP — същият изходен код, същите входни данни, многократно по-дълго изпълнение. Това е предвиденото поведение и то е правилно за по-голямата част от софтуера.

Грешно е само когато машината не може да го поеме, а нищо не предупреждава, когато не може. Обновяването минава успешно, тестовете минават, страницата продължава да работи. Просто отнема половин секунда повече и никой не поглежда това число, освен ако не отиде да го измери.

Реклама