Bcrypt хеш і перевірка
Створити bcrypt-хеш або перевірити пароль
Дані надсилаються на сервер, але не зберігаються
Цей інструмент не можна виконати у браузері, тому введені дані надсилаються на наш сервер. Ми обробляємо їх у пам'яті та одразу повертаємо результат: нічого не записується в базу, у файли чи в логи, нічого не передається третім сторонам. Та все ж не вставляйте сюди справжні робочі паролі чи ключі - для чутливих даних краще скористатися локальними інструментами.
Чому саме bcrypt
Пароль ніколи не зберігають у відкритому вигляді - тільки його хеш. Але звичайні хеш-функції на кшталт SHA-256 для цього не годяться: вони швидкі, і сучасна відеокарта перебирає мільярди варіантів на секунду.
bcrypt створений повільним навмисно. Параметр cost задає, наскільки: кожна одиниця подвоює час обчислення. Це не заважає користувачу, який логіниться раз, але робить перебір мільйонів паролів нерентабельним.
bcrypt також сам генерує сіль і зашиває її в результат. Тому два однакові паролі дають різні хеші, і таблиці попередньо порахованих хешів не працюють.
Як читати хеш
$2y$12$LQv3c1yqBWVHxkd0LHAkCO.YoxUUqXTZJVJXqZ8XBw5PJqcHZKZ4S
│ │ └─ 22 символи солі + 31 символ хеша
│ └──── cost = 12
└──────── алгоритм: 2y = bcrypt
Саме тому перевірка не потребує окремо збереженої солі - вона вже всередині рядка.
Вибір cost
Laravel за замовчуванням використовує 12. Орієнтир простий: хешування має займати приблизно 250-500 мс на вашому продакшн-залізі. Швидше - запас міцності малий; повільніше - логін відчутно гальмує, а ендпоінт стає мішенню для DoS.
Цей інструмент обмежує cost дванадцятьма: вище - це вже секунди процесорного часу на кожен запит.
Обмеження, про яке варто знати
bcrypt читає лише перші 72 байти. Усе після обрізається. З кирилицею це ближче до 36 символів, бо кожна літера - два байти. Для паролів це не проблема, але якщо ви хешуєте щось довше - наприклад, склеєний токен - воно мовчки обріжеться.
У Laravel
// Хешування - Hash-фасад, а не bcrypt() напряму
$user->password = Hash::make($request->password);
// Перевірка
if (! Hash::check($request->password, $user->password)) {
throw ValidationException::withMessages([...]);
}
// Автоматичне перехешування при зміні cost у конфігу
if (Hash::needsRehash($user->password)) {
$user->update(['password' => Hash::make($plain)]);
}
// Каст 'hashed' хешує при присвоєнні - зайвий Hash::make() зробить подвійний хеш
protected function casts(): array
{
return ['password' => 'hashed'];
}
// У тестах низький cost економить хвилини на повному прогоні
// config/hashing.php
'bcrypt' => ['rounds' => env('BCRYPT_ROUNDS', 12)],
bcrypt чи Argon2
Argon2id сучасніший і стійкіший до атак на спеціалізованому залізі. Laravel підтримує обидва. Але bcrypt перевірений двома десятиліттями, є всюди і лишається цілком безпечним вибором - міняти працюючий bcrypt на Argon2 без причини не варто.
Про цю сторінку: bcrypt неможливо порахувати у браузері, тому пароль надсилається на наш сервер, обробляється в пам'яті й одразу забувається. Справжній робочий пароль сюди краще не вставляти - для нього є php artisan tinker.
- Де виконується
- на сервері
- Категорія
- Хеші й безпека