11.06.2025
4 хвилин читання

Хешування паролів у PHP: найкращі практики для безпеки

хэширование паролей в php

Що таке хешування і навіщо воно потрібне?

Якщо ти хоч раз зберігав паролі користувачів у базі, то напевно замислювався: “А чи безпечно це?”. І якщо твоя відповідь – “Ну, я ж використовую md5 код, значить, норм”, то у мене погані новини. Просто хешувати пароль недостатньо – важливо робити це правильно. Давай розберемося, які методи дійсно працюють.

Хешування – це процес перетворення пароля на унікальний рядок фіксованої довжини. На відміну від шифрування, цей процес незворотній: розшифрувати php hash не можна, можна тільки спробувати підібрати вихідне значення.

Всі ці деталі під час програмування на php ти зможеш більш поглиблено вивчити на курсах від FoxmindEd.

🚀 Готові до нових викликів? Долучайтеся до нашого курсу PHP від FoxmindEd та розпочніть свій шлях у світі веб-розробки!
Дізнатись більше

Відмінність хешування від шифрування

Хешування і шифрування – це дві великі різниці. Шифрування – це коли ти можеш розшифрувати дані за наявності ключа. Наприклад, якщо ти зашифруєш “123456” і потім передаси ключ розшифровки, інший користувач зможе повернути вихідний пароль. З хешуванням так не вийде.

Хеш-функція генерує рядок, але у зворотний бік його перетворити неможливо. Це ідеальний варіант для зберігання паролів: база даних містить тільки хеш пароля, а не сам пароль.

Чому не можна зберігати паролі у відкритому вигляді?

Простий приклад: уяви, що твоя база даних витекла в мережу. Якщо ти зберігав паролі в чистому вигляді – вітаю, зловмисники вже отримали повний доступ до акаунтів користувачів. Якщо ж паролі були хешовані (і правильно), вони витратять роки на їхній злам.

Основні вимоги до безпечного хешування

  1. Використання надійних хеш-функцій (хеш-функція md5 сюди не входить, але про це пізніше).
  2. Додавання солі (salt) для захисту від райдужних таблиць.
  3. Повторне хешування (key stretching) для ускладнення підбору.
  4. Вибір алгоритмів, стійких до атаки перебором (brute force).

Популярні хеш-функції для PHP

Хеш-функція MD5: чому її не варто використовувати?

Колись md5 php password вважався стандартом безпеки. Сьогодні його можна зламати за лічені секунди за допомогою райдужних таблиць або атаки перебором. Навіть якщо додати сіль, це не врятує – потужність сучасних GPU дозволяє швидко знаходити колізії.

SHA-256 і SHA-512: чи надійніші вони за MD5?

SHA-256 і SHA-512 набагато надійніші, але вони теж не ідеальні. Ці алгоритми розроблені для криптографії, але не для зберігання паролів. Вони працюють занадто швидко, що робить їх уразливими до атак brute force.

bcrypt і Argon2 – сучасні стандарти безпеки

Ось що дійсно варто використовувати. bcrypt і Argon2 спеціально створені для зберігання паролів. Вони повільні (що добре) і дають змогу налаштовувати складність обчислень. Argon2 навіть визнано найкращим алгоритмом на конкурсі Password Hashing Competition.

Як правильно хешувати паролі в PHP?

Використання функції password_hash()

PHP пропонує вбудовану функцію password_hash(), яка автоматично використовує сіль і за замовчуванням застосовує bcrypt:

$hash = password_hash('my_secure_password', PASSWORD_DEFAULT);

echo $hash;

Перевірка пароля за допомогою password_verify()

Щоб перевірити введений пароль, використовуй password_verify(). Ця функція порівняє введений пароль із хешем:

if (password_verify('my_secure_password', $hash)) {

    echo "Пароль вірний!";

} else {

    echo "Error: password is incorrect.";

}

Помилки під час хешування паролів

Використання застарілих алгоритмів

Якщо ти досі використовуєш хеш-функцію md5, SHA-1 або навіть SHA-256 – час щось змінювати. Вони занадто швидкі, а отже, піддаються атаці перебором.

Відсутність механізму оновлення хешів

З часом алгоритми застарівають. PHP пропонує password_needs_rehash(), щоб оновлювати хеші під час зміни алгоритму:

if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {

    $hash = password_hash($password, PASSWORD_DEFAULT);

}

Неправильне зберігання та передавання хешованих даних

Хеш повинен зберігатися в базі даних у вигляді рядка, а не передаватися в URL або логи. Ніколи не логіруй хеші паролів!

Захистіть паролі від атак

  • Атаки перебором (Brute Force) і райдужні таблиці

Brute force – це атака шляхом перебору всіх можливих комбінацій пароля. Райдужні таблиці – це готові бази даних із хешами для швидкого розшифрування. Ось чому не можна використовувати md5 код і SHA-1.

  • Як працює сіль і чому вона важлива?

Сіль – це випадковий рядок, що додається до пароля перед хешуванням. Вона захищає від райдужних таблиць. password_hash() додає сіль автоматично, тому тобі не потрібно турбуватися.

  • Двофакторна авторизація як додатковий рівень захисту

Навіть надійне хешування не захистить від фішингу та витоків. Вмикай 2FA – наприклад, через Google Authenticator або SMS-коди.

Підпишіться на наш Ютуб-канал! Корисні відео для програмістів чекають на вас! YouTube
Оберіть свій курс програмування! Шлях до кар’єри програміста починається тут! Подивитись

Приклад коду: безпечне хешування паролів у PHP

Генерація хешу з password_hash()

$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);

Перевірка пароля з password_verify()

if (password_verify($inputPassword, $hash)) {

    echo "Password is correct";

}

Рекомендації з налаштування cost-фактора для bcrypt

Параметр cost визначає складність обчислень. Значення 10-12 – оптимальне. Що вище значення, то складніші обчислення, але тим вище навантаження на сервер.

Висновок

Якщо ти досі використовуєш md5 php password, саме час переглянути підхід. Використовуй bcrypt або Argon2, додавай сіль, перевіряй паролі через password_verify(), не забувай про 2FA і регулярно оновлюй алгоритми. Це мінімум, який допоможе захистити дані користувачів.

FAQ
Хешування перетворює пароль на зашифрований рядок, який неможливо розшифрувати - тільки звірити під час входу.
Хеш не можна розшифрувати, на відміну від шифру, який можна відновити за наявності ключа.
У разі витоку бази паролі у відкритому вигляді одразу стають доступними зловмисникам.
bcrypt і Argon2 - найнадійніші. Вони спеціально створені для зберігання паролів і захищені від перебору.
Сіль - це випадковий рядок, який додають до пароля перед хешуванням, що захищає від райдужних таблиць.
Використовують застарілі алгоритми (як md5), не оновлюють хеші та передають їх у логах або URL.

У вас залишилися запитання про хешування паролів у PHP? Пишіть у коментарях - обговоримо!

Додати коментар

Ваш імейл не буде опубліковано. Обов'язкові поля відзначені *

Зберегти моє ім'я, імейл та адресу сайту у цьому браузері для майбутніх коментарів

foxmindED
ІТ-спека: Знижка 20% на стартові курси!
до кінця акції
00
днів
00
годин
00
хвилин
Забронювати