Когда я впервые отправил систему входа в систему, я сделал то, что мне предлагал каждый учебник той эпохи: хранил md5($password) в таблице пользователей и двигался дальше. это сработало, и это было тихо катастрофой. годы построения auth в плагины WordPress и приложения Laravel позже, я гораздо более здоровый уважение к разрыву между & quot;проверка пароля проходит & quot; и & quot; пароли безопасны, если эта база данных утекает. & quot; Bcrypt является инструментом, который закрывает большую часть этого разрыва, и это по умолчанию почти в каждой структуре, к которой я обращаюсь. поэтому я построил генератор bcrypt во время Toolz.dev это хэширует пароль с фактором стоимости, который вы контролируете, проверяет пароль на соответствие существующему хэшу и делает все это в вашем браузере, поэтому ничего из того, что вы вводите, никогда никуда не отправляется. Это руководство по нему и самому bcrypt.
TL;DR: Bcrypt превращает пароль в соленый, намеренно медленный 60-значный хеш, чтобы просочившаяся база данных не была просочившимся списком паролей. Инструмент генератор bcrypt хэширует любой пароль с регулируемым фактором стоимости (от 4 до 31), проверяет пароль на соответствие хэшу, который вы вставляете, и показывает версию, стоимость и соль, которые он анализирует. Он производит стандарт
$2b$отформатируйте OpenBSD, PHPpassword_hashбиблиотеки bcrypt Laravel и Node принимают, и он полностью работает на стороне клиента.
Что такое bcrypt?
Bcrypt - это функция хеширования паролей, разработанная Нильсом Провосом и Дэвидом Мазьересом и представленная в их статье USENIX 1999 года "Адаптируемая к будущему схема паролей". Он построен на блочном шифре Blowfish, но с поворотом: вместо шифрования данных он запускает шаг настройки ключа Blowfish's снова и снова, используя пароль и случайную соль в качестве ключевого материала. Результатом является односторонний хеш, который дешево вычислить один раз и дорого вычислить миллиард раз, что является именно тем, что необходимо для хранения пароля свойства.
Это "дорого по назначению" идея - это суть этого. хэш общего назначения, такой как SHA-256, спроектирован так, чтобы быть быстрым, потому что контрольные суммы и проверки целостности хотят скорости. хеширование пароля хочет обратного. если злоумышленник крадет вашу базу данных, единственное, что стоит между ними и каждым паролем открытого текста, - это сколько времени требуется, чтобы угадать. быстрый хэш позволяет современному графическому процессору тестировать миллиарды кандидатов в секунду; хэш bcrypt по разумной цене ограничивает его цену несколькими тысячами в секунду. Тот же самый просочившийся файл, совершенно другой результат.
Bcrypt просуществовал более двух десятилетий, потому что он правильно понял основы и адаптируется. Коэффициент стоимости означает, что тот же алгоритм, который был настроен на оборудование 1999 года, можно набирать для оборудования 2026 года, не меняя ничего другого. Это остается рекомендуемым вариантом в обманный лист для хранения паролей OWASPи это нестандартный дефолт в Laravel, Spring Security и многих других стеках, в которых я работаю. Если вам нужен более глубокий фон о том, почему быстрые хэши не подходят для этой работы, онлайн-инструменты конфиденциальности данных в руководстве рассматриваются рассуждения, которые подтолкнули всю отрасль к медленному соленому хешированию.
Что содержит хэш bcrypt?
Одна из самых приятных вещей в bcrypt заключается в том, что его вывод является самоописывающим Возьмите настоящий хэш:
$2b$12$R9h/cIPz0gi.URNNX3kh2OPST9/PgBkqquzi.Ss7KIUgO2t0jWMUW
Прочтите слева направо, разделите знаки доллара, и он сообщит вам все необходимое для проверки пароля от него:
| поле | пример | смысл |
|---|---|---|
| версия | 2b |
Вариант bcrypt. 2b является ли текущий исправленный формат OpenBSD |
| стоимость | 12 |
Фактор работы. настройка ключа запускает 2^12 = 4096 итераций |
| Соль | R9h/cIPz0gi.URNNX3kh2O |
22 символа пользовательской Base64, декодирование до 16 случайных байтов |
| Дайджест | PST9/PgBkqquzi.Ss7KIUgO2t0jWMUW |
31 символ, кодирующий 23-байтовый выход bcrypt |
Поскольку соль и стоимость живут внутри строки, проверка больше ничего не требует. Когда вы вставляете хеш в строку генератор bcrypt проверите режим, он считывает стоимость и соль прямо из строки, перевычисляет дайджест именно с этой солью и сравнивает. Нет отдельной соляной колонки для управления, и это одна из причин, по которой bcrypt так приятно хранить: это одно непрозрачное поле в таблице пользователей.
Пользовательский алфавит Base64 стоит отметить, потому что он сбивает людей с толку. Bcrypt использует ./A-Za-z0-9, который отличается упорядочение от стандартного Base64.Соль bcrypt не является стандартной строкой Base64, поэтому не пытайтесь декодировать ее с помощью общего инструмента Base64 и ожидайте значимых байтов. если вам интересен стандартный вариант, используемый везде, то кодировка base64 гид проходит через обычный алфавит и там, где он появляется.
Как мне сгенерировать хэш bcrypt?
В инструменте это три шага: введите пароль, выберите стоимость, нажмите Генерация. под капотом, генерирование хеша делает больше, чем выглядит. сначала криптографически сильная случайная соль в 16 байт создается с помощью API Web Crypto. Затем bcrypt запускает свой дорогой график ключей, посев Blowfish паролем и солью и итерируя 2^cost раз. Наконец, он шифрует фиксированную магическую строку ("OrpheanBeholderScryDoubt") 64 раза с результирующим состоянием шифрования и Base64-кодирует выход.Весь танец производит 60-символьный хеш.
Единственный самый распространенный сюрприз, что хеширование одного и того же пароля дважды дает два разных хеша Это правильно и намеренно. каждый хеш получает свою собственную случайную соль, поэтому два пользователя, которые оба выбирают hunter2 в конечном итоге с совершенно разные сохраненные значения. злоумышленник, который крадет таблицу, не может сказать, что две учетные записи совместно используют пароль, и не может повторно использовать предварительно вычисленную таблицу по счетам. если вы хотите воспроизвести определенный хэш для тестирования, вы предоставляете полную солевую строку, а не голую стоимость, что именно режим проверки делает внутри.
В коде приложения вы никогда не собираете ничего из этого вручную Вы звоните в библиотеку:
// PHP
$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
// Node with bcrypt / bcryptjs
const hash = await bcrypt.hash(password, 12)
// Laravel
use Illuminate\Support\Facades\Hash;
$hash = Hash::make($password); // bcrypt by default
Инструмент Toolz предназначен для моментов вокруг этого кода: проверка правильности того, как выглядит хэш, при заданной стоимости, создание известного хэша для сеялки или тестового приспособления или подтверждение того, что хэш, который вы нашли в конфигурации, соответствует паролю, который вы думаете, что это так.
Как выбрать фактор стоимости?
Фактор стоимости - это одна ручка, о которой вам нужно подумать, и честный ответ - "measure, не копируйте." эмпирическое правило OWASP заключается в том, что один хеш должен занять где-то около четверти секунды на вашем производственном оборудовании. Эта цель уравновешивает две противоположные силы: слишком низкую, и вы делаете взлом дешевым, слишком высоким, и каждый законный вход платит цену, что имеет значение, когда занятая конечная точка хеширует каждый запрос.
Поскольку стоимость является степень двух, каждый шаг удваивает работу Стоимость 11 в два раза медленнее, чем стоимость 10, стоимость 12 в четыре раза медленнее На типичном оборудовании сервера 2020-х годов стоимость от 10 до 12 земель в правильном соседстве, поэтому фреймворки по умолчанию там Инструмент показывает приблизительную оценку времени, как вы перетаскиваете ползунок, чтобы вы могли чувствовать, как быстро стоимость составляет, но относиться к этому как относительное руководство, а не как к эталону вашего сервера. Реальное число зависит от вашего ЦП, и единственный способ узнать это - это время password_hash на коробке, которая будет его запускать.
Один практический шаблон, который стоит знать: поскольку стоимость хранится внутри каждого хеша, вы можете поднять его с течением времени без миграции. при успешном входе в систему у вас есть открытый текст на мгновение, поэтому вы проверяете, не ниже ли сохраненный хеш's стоимость вашей текущей цели и, если да, перефразировать и обновить. PHP раскрывает это напрямую через password_needs_rehash. Это означает, что ваша безопасность идет в ногу с оборудованием, даже не форсируя сброс пароля.
Bcrypt против SHA-256, Argon2 и scrypt
Сравнение, которое имеет наибольшее значение, - это bcrypt против простого быстрого хеша и против новых функций, требующих большой памяти. Вот как они выстраиваются в очередь для хранения паролей:
| Функция | Соленый | Медленно специально | Твердый на память | Хорошо подходит для паролей? |
|---|---|---|---|---|
| МД5/ША-256 | Нет (сам по себе) | нет | нет | Нет, слишком быстро |
| бкрипт | Да, встроенный | Да, перестраиваемая стоимость | нет | Да, рекомендуется |
| скрипт | да | да | да | да |
| Аргон2id | да | да | да | Да, предпочитается для новых систем |
Голый SHA-256 пароля, даже соленый, - неправильный инструмент: он рассчитан на скорость, поэтому просочившаяся база данных соленых хешей SHA-256 быстро попадает на графический процессор. Если вам нужен только быстрый дайджест контрольной суммы или ключа кэша, а не пароля, вот что хэш-генератор является для, и различие весь смысл.Argon2id, победитель конкурса хеширования паролей 2015 года, добавляет твердость памяти, которая сопротивляется пользовательскому оборудованию, которое может ускорить bcrypt, и это первый выбор для совершенно новой системы, где вы управляете временем выполнения. Но bcrypt не устаревает. Это проверено в бою, это по умолчанию в инструментах, которые я использую ежедневно, и выбор это разумное решение, особенно когда ваш фреймворк поставляет его. Ошибка, которую следует избегать, - это не "bcrypt вместо Argon2, & quot; быстрый хеш вместо любого из них. & quot; Для более широкого тура утилит безопасности, которые сочетаются с хешированием, Инструменты повышения производительности разработчик у гида есть карта.
А как насчет ограничения в 72 байта и других готчей?
Bcrypt считывает только первые 72 байта пароля. Все прошлое, что молча игнорируется, что для обычных паролей никогда не имеет значения, но может передать очень длинную парольную фразу, особенно с многобайтовыми символами UTF-8, где счетчик байтов поднимается быстрее, чем счетчик символов. Инструмент предупреждает вас всякий раз, когда ваш ввод пересекает 72 байта UTF-8, поэтому усечение никогда не является молчаливым сюрпризом. Некоторые системы работают вокруг предела, предварительно хешируя пароль с помощью SHA-256 и кодирования Base64, прежде чем передать его в bcrypt, который сворачивает сколь угодно длинный пароль в фиксированный короткий ввод; если вы сделаете это, делайте это последовательно как при регистрации, так и при входе в систему.
Другая попалась - префикс версии Вы увидите $2a$, $2y$, и $2b$ в дикой природе. $2a$ был ли оригинал, $2y$ был ли PHP-специфичный тег введен после того, как в некоторых реализациях была обнаружена ошибка расширения знака, и $2b$ является текущей исправленной версией OpenBSD. Для новых хэшей вы хотите $2b$, что и производит этот инструмент Все трое одинаково проверяют обычные пароли ASCII; различия только всплывают с конкретными байтами, отличными от ASCII, вблизи границы в 72 байта. Когда вы вставляете токен в инструмент, который также проверяет структурированные учетные данные, например Декодер JWTимейте в виду, что хэш bcrypt - это не токен, который вы декодируете для чтения полезной нагрузки; это односторонний дайджест, в котором нечего раскрыть.
Где генератор bcrypt помещается в реальный рабочий процесс
Сам по себе хеш - это только половина истории, поэтому микшер находится рядом с другими инструментами учетных данных, которые я держу открытыми. Когда я запускаю тестовую базу данных или настраиваю демо-счет, я генерирую сам пароль с помощью генератор паролейубедитесь, что он преодолевает разумную силовую планку проверка силы пароляи только потом пропустите его через генератор bcrypt чтобы получить сохраненный хэш. Этот порядок имеет значение: надежный случайный пароль за хэшем шифрования стоимостью 12 b действительно трудно взломать, в то время как слабый пароль за тем же хэшем все еще попадает в атаку словаря, потому что злоумышленнику нужно только угадать горстку вероятных кандидатов, а не все пространство ключей. Коэффициент стоимости выигрывает у вас время; энтропия пароля - это то, против чего тратится это время.
Режим проверки зарабатывает свое место во время отладки, Когда логин загадочным образом не удается в постановке, самый быстрый способ изолировать проблему является вставить сохраненный хэш и пароль вы считаете правильным и посмотреть, совпадают ли они, совпадение означает, что ошибка выше, в том, как пароль достигает проверки; несоответствие означает, что сохраненный хэш был написан с другим паролем или искаженной кодировкой. либо ответ спасает вас от угадывания, и поскольку все это работает локально, вы можете сделать это с реальным хэшем, извлеченным из базы данных, без того, чтобы этот хэш когда-либо покидал ваш автомат Это один и тот же клиентский принцип за каждым инструментом на сайте, и для всего, что касается учетных данных, это не является приятным, это требование.
Часто задаваемые вопросы
Безопасно ли хешировать настоящий пароль в этом генераторе bcrypt?
Да, потому что хеширование происходит полностью в вашем браузере и ничего никуда не отправляется Вы можете подтвердить это на вкладке Сеть инструментов вашего разработчика: генерирование хеша не делает запроса. тем не менее, вкладка браузера не является менеджером паролей, поэтому избегайте вставки живых учетных данных производственной учетной записи в любую веб-страницу, которую вы не создали, и закройте вкладку, когда вы закончите.
Почему один и тот же пароль каждый раз создает другой хэш bcrypt?
Потому что bcrypt генерирует новую случайную соль для каждого хеша и смешивает ее в результат Это особенность: два пользователя, которые выбирают один и тот же пароль, по-прежнему получают разные сохраненные хеши, поэтому злоумышленник не может обнаружить общие пароли или повторно использовать предварительно вычисленную таблицу. Проверка по-прежнему работает, потому что соль хранится внутри самой хеш-строки.
Какой фактор стоимости мне следует использовать для bcrypt?
Используйте самые высокие затраты, которые ваш поток входа может выдержать без раздражающей задержки, которая для большинства серверов 2020-х стоит от 10 до 12. OWASP предлагает один хеш должен занять примерно четверть секунды на вашем производственном оборудовании. Поскольку каждый шаг удваивает работу, измеряйте на своем собственном сервере, а не копируйте число, и повышайте стоимость каждые несколько лет по мере ускорения аппаратного обеспечения.
Можно ли вернуть хэш bcrypt обратно к паролю?
Нет. Bcrypt - это односторонняя функция, поэтому нет математического способа превратить хеш обратно в исходный пароль. единственная атака - это угадывание: злоумышленник хеширует пароли кандидатов с той же солью и стоимостью и проверяет совпадение. Вот почему фактор стоимости имеет значение, потому что он определяет, насколько дорого стоит каждое предположение, и почему сильные уникальные пароли плюс высокая стоимость делают угадывание непрактичным.
Безопасен ли bcrypt в 2026 году или мне следует переключиться на Argon2?
Bcrypt по-прежнему считается безопасным для хранения паролей и остается рекомендуемой опцией в чит-листе хранилища паролей OWASP. Argon2id, победитель конкурса хеширования паролей 2015 года, предпочтителен для новых систем, в которых вы контролируете время выполнения, поскольку он также сопротивляется атакам графического процессора и специализированного оборудования. Bcrypt - это разумный выбор, особенно когда ваш фреймворк отправляет его по умолчанию; настоящая ошибка - использовать быстрый хэш общего назначения вместо любой функции хеширования паролей.
Каков предел в 72 байта в bcrypt?
Bcrypt считывает только первые 72 байта пароля, закодированного в UTF-8, поэтому любые символы, помимо этого, игнорируются. Для обычных паролей это никогда не имеет значения, но очень длинная парольная фраза может быть усечена, поэтому некоторые системы предварительно хешируют пароль с помощью SHA-256 перед bcrypt. Этот инструмент предупреждает вас всякий раз, когда ваш ввод превышает 72 байта, поэтому усечение никогда не является сюрпризом.
Что означают префиксы $2a$, $2b$ и $2y$?
Это теги версий для формата вывода bcrypt. $2a$ был оригинальным, $2y$ было исправлением для PHP-ошибки расширения знака, а $2b$ - текущей исправленной версией OpenBSD. Для новых хешей $2b$ правильно, что и производит этот инструмент. все три проверяют одинаково для паролей ASCII; различия появляются только с некоторыми байтами, отличными от ASCII, на границе в 72 байта.
Является ли bcrypt тем же, что шифрование?
Нет. Шифрование обратимо с ключом, поэтому зашифрованные данные могут быть расшифрованы обратно к исходному.Bcrypt хеширование является односторонним и намеренно медленным, и оно предназначено только для проверки: вам никогда не нужно восстанавливать пароль, только для подтверждения кого-то набрал правильный. Хранение паролей с шифрованием вместо хеширования является анти-шаблон, потому что кто держит ключ может восстановить каждый пароль.



