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

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.