Паролі зберігають лише як повільний односторонній хеш - 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, і тоді перезапис при вході поступово переведе активних користувачів. Неактивні лишаться на старому, і для них можна запланувати примусове скидання через рік-два, а потім повернути перевірку.
Докладніше в документації: Визначення потреби в перехешуванні