Bcrypt vs Argon2: який алгоритм хешування паролів вибрати у 2026 році
Bcrypt та Argon2 — це два найпопулярніших алгоритми хешування паролів сьогодні. Обидва призначені для повільного виконання та стійкості до атак грубої сили, на відміну від MD5 чи SHA-256, які швидкі за своєю природою. Argon2 переміг у змаганні Password Hashing Competition у 2015 році і зараз є рекомендованим вибором OWASP для нових додатків. Bcrypt залишається відмінним зрілим і широко підтримуваним рішенням. Ця стаття детально пояснює відмінності, щоб допомогти вам зробити вибір.
Чому хеш пароля відрізняється щоразу?
Це нормально і бажано! Кожного разу при викликанні функції хешування генерується випадкова сіль (salt). Сіль зберігається разом із хешем і гарантує, що два однакових паролі матимуть абсолютно різні хеші. Це запобігає атакам за райдужними таблицями (заздалегідь обчисленими таблицями поширених хешів).
Bcrypt: 1999 рік, Blowfish, параметр cost
Bcrypt був розроблений Нілсом Провосом і Девідом Мазьєром для OpenBSD у 1999 році. Він
заснований на алгоритмі шифрування Blowfish, використовуючи високу вартість ініціалізації його таблиць. Bcrypt має єдиний параметр, cost (або rounds), який визначає
кількість ітерацій у вигляді 2^cost. Збільшення cost на 1 подвоює час обчислення.
Типовий формат виводу:
$2y$12$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
| | | |
| | cost = 12 сіль + хеш у base64
| варіант (2y = openbsd)
алг bcrypt
Bcrypt обмежує вхід 72 байтами: більш довгий пароль обрізається без попередження, що є відомою пасткою. Звичайне рішення — попереднє хешування з SHA-256 з подальшим кодуванням у base64 перед bcrypt, але це може вводити проблемні нульові байти в деяких реалізаціях. Argon2 не має цього обмеження.
Argon2: 2015 рік, переможець PHC, 3 варіації
Argon2 був розроблений Олексом Бірюковим, Даніелем Діну та Дмитром Ховратовічем. Він переміг у Password Hashing Competition у липні 2015 року та стандартизований RFC 9106 (2021). Argon2 має три параметри:
- Вартість пам’яті (
m): кількість використовуваної пам’яті у КіБ - Часова вартість (
t): кількість ітерацій над блоком пам’яті - Паралелізм (
p): кількість паралельних потоків
Argon2 існує у трьох варіаціях:
- Argon2d: доступ до пам’яті залежить від даних. Більш стійкий до GPU-атак, але чутливий до побічних каналів (таймінг, кеш).
- Argon2i: доступ до пам’яті незалежний від даних. Стійкий до побічних каналів, трохи менш стійкий до GPU-атак.
- Argon2id: гібридний, починає в режимі i, потім переходить в режим d. Рекомендований за замовчуванням RFC 9106 та OWASP.
Параметри, рекомендовані OWASP у 2026 році для Argon2id: m=19456 КіБ (19 МіБ),
t=2, p=1. Типовий формат виводу:
$argon2id$v=19$m=19456,t=2,p=1$c2VsX2FsZWF0b2lyZQ$aGFzaF9jYWxjdWxl
| | | | |
| | параметри сіль base64 хеш base64
| версія
алг argon2id
Чому Argon2id рекомендований?
Стійкість до спеціалізованого обладнання сьогодні є вирішальним критерієм. Bcrypt використовує мало пам’яті (~4 КіБ), що дозволяє сучасним GPU тестувати сотні тисяч хешів за секунду. Argon2id є memory-hard: примусове використання кількох МіБ пам’яті на спробу різко зменшує паралелізм на GPU і робить створення спеціалізованих ASIC економічно недоцільним.
Гібридний режим Argon2id також забезпечує захист від атак через побічні канали під час першої половини обчислень. Саме ця комбінація робить його рекомендацією за замовчуванням від OWASP, NIST SP 800-63B (з ревізії 2024) та RFC 9106.
Порівняльна таблиця
| Критерій | Bcrypt | Argon2id |
|---|---|---|
| Рік | 1999 | 2015 (RFC 9106 у 2021) |
| Алгоритм | Blowfish (адаптований) | Argon2id (переможець PHC) |
| Параметри | Cost (2^n ітерацій) | m (пам’ять), t (час), p (паралелізм) |
| Стійкість до GPU | Низька (~4 КіБ пам’яті) | Висока (~19 МіБ, конфігуровно) |
| Макс. розмір входу | 72 байти (тихе обрізання) | Необмежений |
| Нативна підтримка PHP | Так (з PHP 5.5) | Так (з PHP 7.2 для Argon2i, 7.3 для Argon2id) |
| Рекомендація OWASP 2026 | Прийнятно (cost ≥ 12) | Рекомендовано |
| Зрілість екосистеми | Дуже висока | Висока з ~2018 |
| Міграція | Поступова через password_needs_rehash() |
Ідеально для нових проектів |
Продуктивність і стійкість до атак
На сучасному сервері bcrypt з cost=12 займає близько 250 мс, а argon2id з параметрами OWASP — близько 100-300 мс залежно від машини. Абсолютний час не є головним критерієм: важливий відносний співвідношення між вашою вартістю (одне обчислення, раз на вхід) та вартістю атакуючого (мільярди обчислень на GPU для злому дампу).
На відеокарті RTX 4090 hashcat досягає близько 200 000 bcrypt/с при cost=12, порівняно з кількома десятками тисяч argon2id на 19 МіБ. За той самий час обчислення на стороні сервера Argon2id сповільнює атакуючого у 5-10 разів більше, ніж bcrypt, і цей розрив збільшується з новими поколіннями GPU.
Приклади на PHP
PHP підтримує обидва алгоритми нативно через password_hash() та password_verify()
починаючи з PHP 7.2 для Argon2i (і 7.3 для Argon2id). Конструктор PHP керує сіллю та форматом
автоматично.
Bcrypt
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
$ok = password_verify($password, $hash);
if (password_needs_rehash($hash, PASSWORD_BCRYPT, ['cost' => 12])) {
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
}
Argon2id
$opts = [
'memory_cost' => 19456, // 19 MiB
'time_cost' => 2,
'threads' => 1,
];
$hash = password_hash($password, PASSWORD_ARGON2ID, $opts);
$ok = password_verify($password, $hash);
if (password_needs_rehash($hash, PASSWORD_ARGON2ID, $opts)) {
$hash = password_hash($password, PASSWORD_ARGON2ID, $opts);
}
Рекомендація
Для нових проектів у 2026 році оберіть Argon2id з параметрами OWASP
(m=19456, t=2, p=1), регулюючи за потрібним часом обчислення (зазвичай 250-500 мс).
Для існуючих проектів на bcrypt:
-
Якщо ви вже використовуєте bcrypt з cost ≥ 12, не потрібно терміново мігрувати.
Поступова міграція через
password_needs_rehash()є оптимальною. - Якщо ваш cost < 12, спочатку збільште його до 12, а потім до 14 перед розглядом міграції.
Уникайте використання MD5, SHA-1 та «г올ого» SHA-256 для паролів (дивіться наше порівняння MD5 vs SHA-256). Жоден з цих алгоритмів не призначений для цього використання.
Поширені запитання
Чи безпечний Bcrypt у 2026 році?
Так, за умови використання достатнього значення cost (мінімум 12, бажано 14). У Bcrypt відомі криптографічні вразливості. Його єдина відносна слабкість порівняно з Argon2id — це невеликий слід у пам’яті, що робить його більш вразливим до GPU- та FPGA-атак.
Чи потрібно терміново мігрувати з Bcrypt на Argon2id?
Ні, не терміново. Рекомендований підхід — поступова міграція з password_needs_rehash(): щоразу при успішному вході ви перехешуєте пароль у Argon2id. Через кілька місяців більшість активних користувачів буде мігровано, і ви зможете примусово скинути паролі для неактивних облікових записів.
Яка оптимальна кількість потоків для Argon2id?
OWASP рекомендує p=1 за замовчуванням. Збільшення p не дає нічого, якщо ваш веб-сервер вже обробляє багато паралельних запитів, і ускладнює налаштування. Краще збільшити m (пам’ять), яка є основним чинником стійкості до GPU-атак.
Що таке «bcrypt decrypter»?
Дешифрувальника bcrypt не існує: функція одностороння за своєю природою. Інструменти, які стверджують, що «дешифрують» bcrypt, просто тестують словники поширених паролів проти хешу. Це те саме, що робить нападаючий, який отримав вашу базу даних.
Argon2i чи Argon2id?
Argon2id у всіх випадках для паролів. Argon2i трохи безпечніший щодо побічних каналів, але слабкіший щодо GPU-атак. Argon2id поєднує переваги обох і явно рекомендований RFC 9106 для хешування паролів.
Чи потрібно додавати перець (pepper) окрім солі?
Сілі вистачає для більшості додатків. Перець (секретний ключ, що зберігається поза базою даних і використовується як HMAC перед хешуванням) додає додатковий рівень захисту у разі витоку бази даних без компрометації серверу додатків. Argon2id не надає цієї можливості нативно, її потрібно реалізовувати вручну.