Генератор і перевіряльник хешів паролів

Хешуйте і перевіряйте паролі за допомогою bcrypt, scrypt, Argon2id і PBKDF2 повністю у вашому браузері — генеруйте рядки формату PHC, перевіряйте кандидат-пароль проти наявного хешу і переглядайте параметри, заховані всередині. Нічого не вивантажується.
Лише для тестових паролів. Справжні паролі користувачів ніколи не слід вставляти в жодну вебсторінку. Цей інструмент працює повністю у вашому браузері — рядки ніколи не залишають вашу вкладку, — але реальний витік починається з одного вставлення.
вартість bcrypt (2^cost раундів)
варіант bcrypt варіант змінює лише префікс; сам хеш ідентичний
scrypt N (вартість CPU)
scrypt r / p r =   p = розмір блоку 128·r байтів; пам'ять = 128·N·r байтів (N=214, r=8 → 16 МіБ)
Argon2id m (пам'ять)
Argon2id t / p t =   p = t = проходи; p = паралелізм (лани)
PRF PBKDF2
Ітерації PBKDF2  OWASP 2023: 600 000 для HMAC-SHA-256 (1 300 000 для SHA-1, 210 000 для SHA-384/512)
Довжина виходу (байти)  вихід bcrypt фіксований у 23 байти (31 символ base64 bcrypt)
АлгоритмПараметриПам'ятьДовжина виходуЧас (цей браузер)
bcryptвартість 124 КіБ23 байти-
scryptN=214, r=8, p=116 МіБ32 байти-
Argon2idm=19 МіБ, t=2, p=119 МіБ32 байти-
PBKDF2HMAC-SHA-256, 600 000 ітерацій~032 байти-
Шпаргалка параметрів (OWASP Password Storage Cheat Sheet, мінімуми 2023)
АлгоритмМінімумПримітки
Argon2idm = 19 МіБ (19 456 КіБ), t = 2, p = 1бажаний; стійкий до пам'яті
scryptN = 214, r = 8, p = 1стійкий до пам'яті (мінімум 16 МіБ)
bcryptвартість = 10лише коефіцієнт роботи; обмеження пароля 72 байти
PBKDF2-HMAC-SHA256600 000 ітераційлише стійкість до ітерацій — зручний для GPU, останній вибір
Типові значення на цій сторінці відповідають або перевершують кожен мінімум. Для продакшену обирайте Argon2id, далі scrypt або bcrypt, якщо його немає, і PBKDF2 лише з міркувань відповідності FIPS.
Interop з PHP — password_hash($pw, PASSWORD_BCRYPT) видає $2y$10$...: вставте його в перевірку з кандидат-паролем, і ця сторінка відповість рівно те, що повернула б password_verify(). Вивід PASSWORD_ARGON2ID ($argon2id$v=19$m=65536,t=4,p=1$...) також перевіряється. Рядки PHC з passlib, django-argon2 і обгорток crypto.scrypt теж розбираються.
Самоперевірка
Повторно запускає рушій сторінки на публічних векторах: набір тестів crypt_blowfish для bcrypt, рядки scrypt і Argon2id, згенеровані node/OpenSSL, вектори PBKDF2 з RFC 6070 і публічний набір SHA-256, а також цикли «згенерувати-потім-перевірити» в кожному алгоритмі та негативні тести (неправильний пароль має не пройти, некоректні рядки мають бути відхилені). Нічого нікуди не надсилається.
Хешування паролів пояснено з нуля
Одним реченням: хеш пароля навмисно повільний (і бажано ємний за пам'яттю), щоб крадіжка бази даних не дозволила зловмиснику перебирати мільярди здогадів за секунду — протилежна мета швидкому хешу на кшталт SHA-256, створеному для швидкості.
Чому б просто не SHA-256 пароля?

SHA-256 на сучасному GPU працює на мільярди здогадів за секунду. Пароль з 8 символів має значно менше 1013 комбінацій — години роботи GPU, хвилини на великій установці. Функції хешування паролів (KDF) борються з цим за допомогою параметрів вартості: bcrypt повторює своє ядро 2cost разів, PBKDF2 ітерує HMAC сотні тисяч разів, scrypt і Argon2id додатково вимагають мегабайти пам'яті на здогад, тож GPU (швидкі, але бідні на пам'ять на ядро) втрачають перевагу. Сіль — випадкова, зберігається відкрито всередині рядка хешу — зупиняє попередньо обчислені таблиці веселок і змушує кожен здогад обчислюватися заново для кожного користувача.

Чотири алгоритми на цій сторінці
АлгоритмРікСтійкістьФормат підписуОстерігайтеся
bcrypt1999CPU (2cost налаштувань ключа)$2b$12$ + сіль 22 символи + хеш 31 символОбмеження пароля 72 байти (усе після 72 мовчки ігнорується); нульовий байт завершує пароль в оригінальній реалізації на C
PBKDF22000 (RFC 2898/8018)CPU (ітерації)$pbkdf2-sha256$i=600000$ + сіль + хеш (стиль passlib)без витрат пам'яті — GPU і ASIC це люблять; тонко налаштовується лише кількість ітерацій
scrypt2009 (RFC 7914)CPU + пам'ять (128·N·r байтів)$scrypt$ln=14,r=8,p=1$ + сіль + хешN має бути степенем двійки; пам'ять зростає лінійно з r
Argon2id2015 (переможець PHC, RFC 9106)CPU + пам'ять (m КіБ, t проходів)$argon2id$v=19$m=19456,t=2,p=1$ + сіль + хешArgon2i (незалежний від даних) проти Argon2d (залежний від даних) проти Argon2id (гібрид) — завжди обирайте id, якщо не знаєте, чому ні
Стійкість до пам'яті проти стійкості до обчислень

GPU має тисячі ядер, але кожне ядро має доступ лише до невеликої кількості швидкої пам'яті. KDF, що потребує 19 МіБ робочого набору на здогад, обмежує зловмисника кількістю паралельних здогадів, що відповідає кількості 19-МіБ фрагментів пам'яті, — тому Argon2id з 19 МіБ на практиці може бути сильнішим, ніж bcrypt з вартістю 15, попри те, що на вашому ноутбуці займає менше реального часу. PBKDF2 на це не має відповіді: його єдиний важіль — кількість ітерацій, а кремній масштабує їх лінійно.

Читання рядка PHC

Формат modular-crypt / PHC самоописовий: у $argon2id$v=19$m=19456,t=2,p=1$ICEiIyQlJicoKSorLC0uLw$WTGpK4hf... поля — це алгоритм, версія, параметри (m = пам'ять у КіБ, t = проходи, p = лани), сіль у base64, хеш у base64. bcrypt передував стандарту і використовує власну компактну форму: варіант $2b$, вартість 12, потім сіль і хеш у власному алфавіті base64 bcrypt (./A-Za-z0-9). Перевірка на цій сторінці приймає всі ці формати і показує розібрані поля — вставте будь-який знайдений хеш і побачте, з чого він складається.

Типові помилки
  • Швидкий хеш для паролів. Стовпці паролів MD5/SHA-1/SHA-256 падають під звичайними GPU на мільярди здогадів за секунду. Для файлів і даних використовуйте Генератор хешів; для паролів — алгоритми цієї сторінки.
  • Спільна сіль. Одна сіль для всіх користувачів означає, що однакові паролі мають однакові хеші, і таблиці веселок повертаються. Кожен хеш тут отримує свіжу випадкову сіль з 16 байтів.
  • Ігнорування 72 байтів bcrypt. "a"*100 і "a"*72 хешуються однаково — хвіст відкидається. Ця сторінка попереджає в полі введення, коли пароль перевищує 72 байти. У Argon2 такого обмеження немає.
  • Порівняння хешів через == у вашому коді. Перевірка має бути сталочасовою; рушій сторінки робить це внутрішньо (перераховує і порівнює збережені байти), але якщо ви копіюєте підхід, використовуйте сталочасове порівняння.
  • Налаштування параметрів на швидкій машині розробника. Цільові ~250–500 мс хешування на типовому обладнанні ваших виробничих користувачів, а не на вашій робочій станції. Кнопка «Порівняння» показує, що насправді відчуває цей браузер.
  • Повторне хешування при кожній перевірці входу. Спершу перевіряйте; перехешовуйте (наприклад, щоб підвищити вартість) лише після успішної перевірки і зберігайте новий рядок. Функція PHP password_needs_rehash() існує саме для цього.
Часті запитання (FAQ)

Який обрати? Argon2id принаймні з мінімумами OWASP. Якщо середовище його не пропонує: scrypt, потім bcrypt (вартість така, щоб хешування займало ≥250 мс). PBKDF2 — лише там, де цього вимагає сертифікація.

Чому у вихідному рядку показано випадкову сіль? Сіль не є секретом — вона навмисно зберігається відкрито всередині рядка PHC, тож для перевірки потрібні лише рядок і кандидат-пароль. Її завдання — унікальність, а не таємність.

Чи важливий варіант ($2a$ / $2b$ / $2y$)? Для ASCII-паролів вони дають однакові хеші; $2a$ — оригінал 1990-х, $2b$ виправив рідкісну помилку розширення знака (2014), $2y$ — позначка PHP, що виправлення присутнє. Перевірка приймає всі три.

Скільки має тривати хеш? Приблизно 250–500 мс на вхід на серверному обладнанні. Менше 100 мс — і офлайн-зламування дешеве; понад 1 с — і користувачі скаржаться, ще перш ніж безпека покращиться.

Чи можу я перевірити хеш, створений деінде? Так — вставте його й вкажіть кандидат-пароль. Відомі коректні формати: PHP password_hash (bcrypt $2y$ і Argon2id), Python passlib, хешер argon2 з django та рядковий формат scrypt, який використовує інструмент scrypt Tarsnap.

Що робить кнопка «порівняння»? Вона один раз хешує поточний пароль кожним алгоритмом із типовими параметрами сторінки і повідомляє час у цьому браузері — відчуття різниці вартостей, а не строге вимірювання.