Command Palette

Search for a command to run...

Как работает Bcrypt: соль, фактор стоимости и ограничения

Как работает Bcrypt: соль, фактор стоимости и ограничения

T
Toolz Team
|Sep 13, 2026|17 Мин. читать
Предпочитайте Toolz.dev в Google

Часть коллекции Безопасность

Генератор BCrypt

Создавайте и проверяйте хэши паролей bcrypt в браузере с помощью регулируемого коэффициента затрат

Используйте Генератор BCrypt

Когда я впервые отправил систему входа в систему, я сделал то, что мне предлагал каждый учебник той эпохи: хранил md5($password) в таблице пользователей и двигался дальше. это сработало, и это было тихо катастрофой. годы построения auth в плагины WordPress и приложения Laravel позже, я гораздо более здоровый уважение к разрыву между & quot;проверка пароля проходит & quot; и & quot; пароли безопасны, если эта база данных утекает. & quot; Bcrypt является инструментом, который закрывает большую часть этого разрыва, и это по умолчанию почти в каждой структуре, к которой я обращаюсь. поэтому я построил генератор bcrypt во время Toolz.dev это хэширует пароль с фактором стоимости, который вы контролируете, проверяет пароль на соответствие существующему хэшу и делает все это в вашем браузере, поэтому ничего из того, что вы вводите, никогда никуда не отправляется. Это руководство по нему и самому bcrypt.

TL;DR: Bcrypt превращает пароль в соленый, намеренно медленный 60-значный хеш, чтобы просочившаяся база данных не была просочившимся списком паролей. Инструмент генератор bcrypt хэширует любой пароль с регулируемым фактором стоимости (от 4 до 31), проверяет пароль на соответствие хэшу, который вы вставляете, и показывает версию, стоимость и соль, которые он анализирует. Он производит стандарт $2b$ отформатируйте OpenBSD, PHP password_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 хеширование является односторонним и намеренно медленным, и оно предназначено только для проверки: вам никогда не нужно восстанавливать пароль, только для подтверждения кого-то набрал правильный. Хранение паролей с шифрованием вместо хеширования является анти-шаблон, потому что кто держит ключ может восстановить каждый пароль.

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!