Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Як зберігати паролі й переходити на сильніший хеш без скидання паролів?

Паролі зберігають лише як повільний односторонній хеш - bcrypt чи argon2id через Hash::make().

  • Не шифрування: зашифроване відновлюється ключем, і витік ключа відкриває всі паролі.
  • Не SHA-256 чи MD5: вони швидкі, і на відеокарті перебирають мільярди варіантів за секунду.
  • Сіль генерується для кожного пароля окремо й зберігається в самому рядку хешу - окремо нічого не треба.

Посилення без скидання. Параметри хешування з часом піднімають - наприклад, BCRYPT_ROUNDS з 12 до 13. Старі хеші при цьому лишаються робочими, бо параметри записані в них самих.

Оновити їх можна лише в момент, коли відомий відкритий пароль, - при вході:

if (Hash::needsRehash($user->password)) {
    $user->update(['password' => Hash::make($plainPassword)]);
}

У Laravel це робиться автоматично: опція rehash_on_login у config/hashing.php увімкнена за замовчуванням, і після успішного входу хеш перезаписується з новими параметрами.

Перехід на інший алгоритм (bcrypt → argon2id) потребує ще одного кроку. За замовчуванням Hash::check() відхиляє хеш, створений іншим алгоритмом, і кидає RuntimeException - це захист від підміни хешу. На час переходу ставлять HASH_VERIFY=false, і тоді перезапис при вході поступово переведе активних користувачів. Неактивні лишаться на старому, і для них можна запланувати примусове скидання через рік-два, а потім повернути перевірку.

Докладніше в документації: Визначення потреби в перехешуванні

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання