Скільки коштує пароль на Raspberry Pi
Сторінки статистики тут можна закрити паролем. Обчислення хешу цього пароля — єдина дія в цій службі, яка має бути повільною: саме це робить викрадений хеш дорогим для зламу. Питання в тому, наскільки повільною, на цьому залізі.
Виміряно на машині, де працює цей сайт, PHP 8.4.21 на aarch64:
PASSWORD_DEFAULT | 560 мс | (дає cost 12) |
| cost 12 | 595 мс | |
| cost 11 | 277 мс | |
| cost 10 | 138 мс |
Параметр вартості в bcrypt — це показник степеня: кожен крок подвоює роботу. Вимірювання показують саме це подвоєння, що добрий знак: ніщо стороннє не втручається.
Чому усталене значення тут хибний вибір
PHP підняв усталену вартість bcrypt із 10 до 12. На сервері в центрі обробки даних це розумне підвищення — кілька десятків мілісекунд. На маленькій платі ARM це понад півсекунди чистого процесора, на машині, яка в цей самий час малює зображення лічильників для всіх інших.
Півсекунди на один вхід погані самі собою. Гірші вони як запрошення: точку входу може викликати будь-хто, і кожен виклик з’їдає 560 мс єдиного процесора, що обслуговує весь сайт. Так перевірка пароля стає найдешевшим способом перевантаження з тих, що тут є.
Тому вартість закріплено на 10, а не залишено усталеному значенню. Це навмисне слабше за те, що PHP обирає сьогодні, і це варто сказати прямо, а не закопувати: хеш із вартістю 10 вчетверо дешевше зламати, ніж із вартістю 12. Викуповує це те, що пароль насправді захищає — видимість сторінки з числами відвідувань, не обліковий запис, не гроші, не особу. За нею немає нічого, чим можна заволодіти.
Частина, яку легко проґавити
PASSWORD_DEFAULT — за задумом рухоме значення. Код, написаний роки тому і який його використовує, мовчки ставатиме повільнішим з кожним оновленням PHP: той самий вихідний текст, той самий ввід, кратний час виконання. Так і задумано, і для більшості програм це правильно.
Хибно це лише тоді, коли машина цього не витримує, і ніщо не попереджає, коли не витримує. Оновлення проходить, випробування проходять, сторінка й далі працює. Просто триває на півсекунди довше, і на це число ніхто не дивиться, доки не піде й не виміряє.