Генератор и проверка хешей паролей

Вычисляйте и проверяйте хеши паролей с помощью bcrypt, scrypt, Argon2id и PBKDF2 полностью в вашем браузере — создавайте строки в формате PHC, проверяйте кандидата-пароль по существующему хешу и смотрите параметры, спрятанные внутри него. Ничего не загружается.
Только для тестовых паролей. Настоящие пароли пользователей не следует вставлять ни в одну веб-страницу. Этот инструмент работает полностью в вашем браузере — строки не покидают вкладку, но реальная утечка начинается с одной вставки.
Стоимость bcrypt (2^стоимость раундов)
Вариант bcrypt вариант меняет только префикс; сам хеш идентичен
scrypt N (стоимость по процессору)
scrypt r / p r =   p = размер блока 128·r байт; память = 128·N·r байт (N=214, r=8 → 16 МиБ)
Argon2id m (память)
Argon2id t / p t =   p = t = проходы; p = параллелизм (полосы)
PBKDF2 PRF
Итерации 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.
Совместимость с 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 выполняет миллиарды догадок в секунду. Восьмисимвольный пароль имеет намного меньше 1013 комбинаций — это часы работы GPU, минуты на мощной установке. Функции хеширования паролей (KDF) борются с этим через параметры стоимости: bcrypt повторяет своё ядро 2стоимость раз, PBKDF2 итерирует HMAC сотни тысяч раз, а scrypt и Argon2id дополнительно требуют мегабайты памяти на каждую догадку, так что GPU (быстрые, но бедные памятью на ядро) теряют преимущество. Соль — случайное значение, которое хранится открыто внутри строки хеша, — мешает предвычисленным радужным таблицам и заставляет каждую догадку вычислять заново для каждого пользователя.

Четыре алгоритма на этой странице
АлгоритмГодСтойкостьФормат подписиОбратите внимание на
bcrypt1999ЦП (2стоимость настроек ключа)$2b$12$ + соль 22 символа + хеш 31 символограничение пароля 72 байта (всё, что дальше 72, молча игнорируется); нулевой байт завершает пароль в исходной реализации на C
PBKDF22000 (RFC 2898/8018)ЦП (итерации)$pbkdf2-sha256$i=600000$ + соль + хеш (стиль passlib)нет затрат памяти — GPU и ASIC это любят; настраивается только число итераций
scrypt2009 (RFC 7914)ЦП + память (128·N·r байт)$scrypt$ln=14,r=8,p=1$ + соль + хешN должно быть степенью двойки; память растёт линейно с r
Argon2id2015 (победитель PHC, RFC 9106)ЦП + память (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().
Вопросы и ответы

Какой выбрать? 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.

Что делает кнопка «сравнение»? Она один раз хеширует текущий пароль каждым алгоритмом с параметрами страницы по умолчанию и показывает время в этом браузере — ощущение разницы в стоимости, а не строгое измерение.