Как расшифровать хэш bcrypt

Обновлено: 04.07.2024

Хеширование заданных данных создает отпечаток пальца, который позволяет идентифицировать исходные данные с высокой вероятностью (очень полезно в компьютерных науках и криптографии).

Как вычислить/закодировать хэш?

Функции используют компьютерные данные (в двоичном формате) и применяют нелинейные и необратимые функции с сильным лавинным эффектом (результат сильно отличается, даже если входные данные очень похожи). Отпечаток обычно возвращается в виде шестнадцатеричных символов.

Пример: dCode имеет для MD5 e9837d47b610ee29399831f917791a44

Пример: dCode имеет для SHA1 15fc6eed5ed024bfb86c4130f998dde437f528ee

Пример: dCode имеет для SHA256 254cd63ece8595b5c503783d596803f1552e0733d02fe4080b217eadb17711dd

См. страницы dCode для каждой функции, чтобы узнать, как она работает в деталях: MD5, SHA1, SHA256 и т. д.

Как расшифровать хэш?

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

Пример: 123+456=579 , из 579 как найти 123 и 456 ? Это возможно только путем перебора всех возможных комбинаций.

Функции применяют миллионы необратимых операций, поэтому входные данные невозможно получить.

Функции созданы, чтобы их нельзя было расшифровать, их алгоритмы общедоступны. Единственный способ расшифровать a — это знать входные данные.

Что такое радужные таблицы?

Теоретически возможен режим грубой силы путем проверки всех двоичных строк, но короткое сообщение из 6 байтов уже представляет 281 000 миллиардов комбинаций. Поэтому даже при наличии быстрых процессоров, способных выполнять миллионы вычислений в секунду, требуется несколько дней, месяцев или лет вычислений, чтобы перепробовать все возможности и найти единственный .

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

Пример: dCode использует свои базы данных слов и паролей с миллионами предварительно рассчитанных хэшей.

Если слова нет в словаре, то результата не будет.

Как распознать хэш?

A может принимать разные формы, но наиболее распространенными являются шестнадцатеричные строки: 32 символа 0123456789abcdef для MD5, 40 для SHA-1, 64 для SHA-256 и т. д.

Система кодирования, основанная на bcrypt, использует символ $, за которым следует число, обозначающее используемый алгоритм и его возможные параметры.

Что такое соль (для хэша)?

Радужные таблицы (гигантские базы данных совпадений паролей) растут день ото дня и накапливают пароли, украденные с различных сайтов, и, используя вычислительную мощность суперкалькуляторов, позволяют сегодня расшифровывать короткие пароли за минуты/часы.< /p>

Чтобы противодействовать этому методу, рекомендуется добавлять соль (несколько символов в префиксе или суффиксе) к паролю/сообщению. Таким образом, предварительно рассчитанные таблицы должны быть снова рассчитаны для учета соли, которая систематически изменяет все отпечатки пальцев, шаг соли. Пароли соленые.

Пример: MD5( dCode ) = e9837d47b610ee29399831f917791a44 и MD5 ( dCodeSUFFIX ) = 523e9a80afc1d2766c3e3d8f132d4991

Какова стоимость (за хэш)?

Стоимость – это количество ресурсов, необходимых для расчета . Чтобы усложнить задачу создания радужных таблиц, можно усложнить некоторые хэши, чтобы вычисления заняли несколько миллисекунд или секунд, что делает продолжительность, необходимую для атак, слишком большой, чтобы ее можно было применить.

Что такое bcrypt?

bcrypt — это библиотека криптографических функций, которая применяет к функциям правила рекурсии. По умолчанию применимы понятия соли и стоимости.

Исходный код

Согласно вики, Bcrypt — это функция хеширования паролей, разработанная Нильсом Провосом и Давидом Мазьером на основе шифра Blowfish. Bcrypt использует алгоритм адаптивного хеширования для хранения пароля, который является односторонним хэшем пароля. BCrypt внутренне генерирует случайную соль при кодировании паролей и сохраняет эту соль вместе с зашифрованным паролем. Следовательно, очевидно, что для одной и той же строки будут получены разные закодированные результаты. Но одна общая вещь заключается в том, что каждый раз он генерирует строку длиной 60.

Ниже представлен онлайн-инструмент для создания и сравнения паролей Bcrypt.

Если вы цените то, что мы делаем здесь, на Devglan, вы можете рассмотреть следующее:

Руководство по использованию — онлайн-калькулятор Bcrypt

Для шифрования bcrypt сначала введите обычный текст, который вы хотите зашифровать. Это может быть любой простой текст.Теперь выберите соляной круг. Солевой раунд представляет собой фактор стоимости, а фактор стоимости прямо пропорционален количеству времени, необходимому для вычисления одного хэша BCrypt. Теперь вы можете отправить форму для создания хэша bcrypt онлайн для введенного вами простого текста.

bcrypt-online-tool-usage

Аналогично, чтобы сопоставить хешированный пароль, вам необходимо предоставить хешированный пароль и обычный текст для сопоставления. При этом инструмент сравнит оба ввода и выдаст результат, соответствует ли хешированный пароль и обычный текст истине или ложности.

Существует разница между хэшем, который начинается с "2y", и другими, которые начинаются с "2a". это разные варианты BCrypt из-за улучшений на протяжении многих лет, некоторые старые реализации не будут работать с более новыми, поэтому мне пришлось использовать эту более старую реализацию 2a и 4 раундов, чтобы заменить хэш в БД для некоторого более старого программного обеспечения, чтобы я мог войти по сравнению с другими сайтами, которые используют 2 года.

В идеале старую реализацию следует заменить новой и со временем использовать больше раундов. Это может быть облегчено повторным хешированием пароля пользователя в виде простого текста при следующем входе в систему новым способом, вы можете выполнить проверку строки по первым 6 символам (или еще лучше разделить на $ и посмотреть первые два индекса).


Возможно, вам придется обрабатывать чужие пароли при написании кода. Так как хранение паролей в виде простого текста в вашей базе данных категорически запрещено, как вы должны обрабатывать и хранить их?

Ответ заключается в создании хэша (длинной, сложной и уникальной строки) с использованием пароля пользователя и сохранении этого хэша в вашей базе данных. Позже вы можете сравнить хэш и пароль, чтобы убедиться, что они совпадают.

Если в этом случае ваша база данных будет взломана, хакеру останутся случайные хеш-строки вместо простых текстовых, которые они могли бы использовать для взлома учетных записей ваших пользователей.

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

В этой статье мы рассмотрим, как хэшировать пароль с помощью реализации Bcrypt в Node.js, которая называется bcrypt.js.

Bcrypt — одна из наиболее часто используемых библиотек шифрования на сегодняшний день. Он включает в себя хеш-шифрование вместе с коэффициентом работы, который позволяет определить, насколько дорогой будет хеш-функция (т. е. сколько времени потребуется для ее расшифровки методом грубой силы). Следовательно, он соответствует закону Мура, поэтому по мере того, как компьютеры становятся быстрее, вы можете увеличить коэффициент работы, и хэш будет становиться медленнее для грубой силы.

Прежде чем двигаться дальше, убедитесь, что у вас установлен Node.js и настроен каталог приложения для нашего кода.

Начнем!

Оглавление

Установите пакет NPM bcrypt.js

Прежде чем мы сможем начать писать наш код, нам нужно установить пакет NPM bcrypt.js.

Вы можете установить его с помощью одной из следующих команд:

Когда установка завершена, мы готовы к следующему разделу!

Хешировать пароль

Теперь мы можем хешировать пароль и посмотреть, как все это работает на практике!

Мы покажем вам весь код заранее, а потом объясним каждую часть.

Вот полный код:

Здесь много чего происходит, так что давайте разберемся.

Сначала мы создаем две переменные с именами password и saltRounds .

Переменной пароля будет строка хэшей bcrypt.

И целое число saltRounds дает нам контроль над тем, каковы будут вычислительные затраты на обработку данных. Чем выше число, тем больше времени потребуется машине для вычисления хэша, связанного с паролем. Итак, мы хотим выбрать число, которое будет достаточно высоким, чтобы атака грубой силы заняла слишком много времени, и достаточно коротким, чтобы терпение конечного пользователя не закончилось при регистрации или входе в свою учетную запись. 10 — это значение по умолчанию для saltRounds.

Затем мы последовательно делаем две вещи, чтобы сгенерировать наш хэш:

  • Создайте соль, используя наше целое число saltRounds.
  • Создайте хэш-строку для нашего пароля "mypass123".

Мы используем функцию bcrypt.genSalt() для создания соли. Функция принимает наше целое число saltRounds, равное 10, в качестве параметра и возвращает функцию обратного вызова с сгенерированным результатом соли.

И мы используем функцию bcrypt.hash() для создания хэша. В качестве параметров он принимает наш пароль «mypass123» и соль, которую мы сгенерировали. В функции обратного вызова она возвращает сгенерированную хеш-строку для нашего пароля.

При запуске кода хэш должен быть напечатан в вашей командной строке и выглядеть примерно так:

Это строка, которую вы должны хранить в своей базе данных вместо пароля в текстовой форме.

Очень круто, правда?!

Но подождите! Как мы сверяем пароль пользователя с хэшем, когда хотим аутентифицировать пользователя или войти в систему? Далее мы покажем вам, как это сделать.

Узнайте, как создать и развернуть полнофункциональное, готовое к работе приложение с помощью React.js, Next.js, Node.js и MongoDB.

Проверить введенный пользователем пароль

Теперь, когда мы хэшировали наш пароль, нам нужен способ сравнить его со строкой, введенной конечным пользователем, и посмотреть, соответствует ли она исходному паролю, введенному для этой учетной записи.

К счастью, в Bcrypt есть встроенный способ сделать это! Как и раньше, мы покажем вам полный код, а потом все объясним.

Полный код (убедитесь, что вы заменили YOUR_HASH_STRING хешем, который мы сгенерировали в предыдущем разделе):

Давайте разберем каждую часть кода.

Сначала мы создаем две переменные с именами passwordEnteredByUser и hash. passwordEnteredByUser представляет собой пароль, который пользователь вводит в форме входа, и мы сравним его с хэшем, сгенерированным в предыдущем разделе.

Если все прошло по плану, вы должны увидеть это сообщение в консоли при запуске кода:

Сладкий! Вы просто сопоставляете пароль с его хэшем!

Но мы должны убедиться, что другие строки пароля не работают. Чтобы проверить это, измените значение passwordEnteredByUser на любое, кроме «mypass123»:

Когда вы снова запустите код с новым значением passwordEnteredByUser, вы должны увидеть этот вывод в своем терминале:

Заключение

Вот оно! Теперь вы знаете, как хэшировать пароль в Node.js с помощью JavaScript-реализации библиотеки Bcrypt.

Надеюсь, эта статья помогла вам защитить ваши приложения и воплотить в жизнь все ваши мечты о кодировании!

Как всегда, спасибо за внимание!

Привет, я Ник Мейджор. Я разработчик программного обеспечения из Висконсина, США.

Я создаю бесплатные и платные курсы, опубликовал сотни информационных статей по кодированию и в настоящее время являюсь инженером-программистом внешнего интерфейса в RoundingWell.

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

Дэн Ариас

Инженер отдела исследований и разработок

Последнее обновление: 25 февраля 2021 г.

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

Дэн Ариас

Инженер отдела исследований и разработок

Последнее обновление: 25 февраля 2021 г.


Auth0 Marketplace
Откройте для себя и активируйте интеграции, необходимые для идентификации личности

В предыдущих сообщениях этой саги об аутентификации мы узнали, что хранить пароли в открытом виде нельзя. Вместо этого мы хотим обеспечить односторонний путь к безопасности путем хеширования паролей. Однако мы также выяснили, что одного хеширования недостаточно для предотвращения более сложных атак, таких как радужные таблицы. Лучшим способом хранения паролей является добавление соли к процессу хеширования: добавление дополнительных случайных данных на вход функции хеширования, которая делает каждый хэш пароля уникальным. Идеальная платформа аутентификации должна интегрировать эти два процесса — хеширование и добавление солей — без проблем.

Существует множество криптографических функций, таких как семейство SHA2 и семейство SHA-3. Однако одна из проблем проектирования семейств SHA заключается в том, что они были разработаны, чтобы быть быстрыми в вычислительном отношении. Скорость, с которой криптографическая функция может вычислить хэш, напрямую влияет на надежность пароля.

Например, более быстрые вычисления означают более быстрые атаки методом грубой силы. Современное оборудование в виде центральных и графических процессоров может вычислять миллионы или даже миллиарды хэшей SHA-256 в секунду против украденной базы данных. Вместо быстрой функции нам нужна функция, которая медленно хэширует пароли, чтобы практически остановить злоумышленников. Мы также хотим, чтобы эта функция была адаптивной, чтобы мы могли компенсировать более быстрое оборудование в будущем, заставляя функцию работать все медленнее и медленнее с течением времени.

В Auth0 целостность и безопасность наших данных являются одним из наших главных приоритетов. Мы используем отраслевой и проверенный алгоритм bcrypt для безопасного хеширования и добавления соли паролей. bcrypt позволяет создать платформу защиты паролей, которая может развиваться вместе с аппаратными технологиями для защиты от угроз, которые могут возникнуть в будущем, таких как злоумышленники, обладающие вычислительной мощностью для взлома паролей в два раза быстрее. Давайте узнаем об устройстве и спецификациях, которые делают bcrypt стандартом криптографической безопасности.

Мотивация bcrypt

Технологии быстро меняются. Увеличение скорости и мощности компьютеров может принести пользу как инженерам, пытающимся создавать программные системы, так и злоумышленникам, пытающимся их использовать. Некоторое криптографическое программное обеспечение не предназначено для масштабирования с вычислительной мощностью. Как объяснялось ранее, безопасность пароля зависит от того, насколько быстро выбранная функция криптографического хеширования может вычислить хэш пароля. Быстрая функция будет выполняться быстрее на гораздо более мощном оборудовании.

Чтобы смягчить этот вектор атаки, мы могли бы создать криптографическую хэш-функцию, которую можно настроить так, чтобы она работала медленнее на новом доступном оборудовании; то есть функция масштабируется с вычислительной мощностью. Это особенно важно, поскольку при таком векторе атаки люди склонны сохранять постоянную длину паролей. Следовательно, при разработке криптографического решения этой проблемы мы должны учитывать быстро развивающееся оборудование и постоянную длину пароля.

Этот вектор атаки был хорошо изучен криптографами в 90-х годах, и в 1999 году на выставке USENIX был представлен алгоритм под названием bcrypt, отвечающий этим спецификациям. Давайте узнаем, как bcrypt позволяет нам создавать надежные системы хранения паролей.

Что такое bcrypt?

bcrypt был разработан Нильсом Провосом и Давидом Мазьером на основе шифра Blowfish>): b для Blowfish и crypt для имени функции хеширования, используемой системой паролей UNIX.

Криптовалюта — отличный пример неспособности адаптироваться к технологическим изменениям. По данным USENIX, в 1976 году крипта могла хешировать менее 4 паролей в секунду. Поскольку злоумышленникам необходимо найти прообраз хэша, чтобы инвертировать его, это заставило команду UNIX чувствовать себя очень комфортно в отношении надежности crypt. Однако 20 лет спустя быстрый компьютер с оптимизированным программным и аппаратным обеспечением смог с помощью этой функции хешировать 200 000 паролей в секунду!

По сути, злоумышленник может провести полную атаку по словарю с максимальной эффективностью. Таким образом, криптография, которую было экспоненциально труднее взломать по мере того, как оборудование становилось быстрее, была необходима, чтобы помешать преимуществам скорости, которые злоумышленники могли получить от оборудования.

Шифр Blowfish — это быстрый блочный шифр, за исключением случаев смены ключей>), параметры, которые определяют функциональный результат криптографического алгоритма: каждый новый ключ требует предварительной обработки, эквивалентной шифрованию около 4 килобайт текста>), что считается очень медленным по сравнению с другими блочными шифрами. Такая медленная смена ключа выгодна для таких методов хэширования паролей, как bcrypt, поскольку дополнительные вычислительные потребности помогают защититься от атак по словарю и грубой силы, замедляя атаку.

Как показано в разделе «Blowfish на практике»>), bcrypt способен смягчить такие виды атак, сочетая дорогостоящую фазу настройки ключа Blowfish с переменным числом итераций для увеличения рабочей нагрузки и продолжительности хэш-вычислений. Самым большим преимуществом bcrypt является то, что со временем количество итераций может быть увеличено, чтобы сделать его медленнее, позволяя bcrypt масштабироваться с вычислительной мощностью. Мы можем уменьшить любые преимущества, которые злоумышленники могут получить от более быстрого оборудования, увеличив количество итераций, чтобы сделать bcrypt медленнее.

Отправить твит

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

Отправить твит

Как работает bcrypt?

Прово и Мазьер, разработчики bcrypt , использовали сложную фазу установки дорогостоящего ключа шифра Blowfish для разработки нового алгоритма установки ключа для Blowfish под названием "eksblowfish", что означает "дорогой планировщик ключей Blowfish".

Что такое "настройка ключа"? По словам Иэна Хаусона, инженера-программиста NVIDIA: «Большинство шифров состоят из фазы установки ключа и фазы работы. Во время установки ключа инициализируется внутреннее состояние. Во время работы входной зашифрованный или открытый текст шифруется или расшифровывается. Только установка ключа необходимо проводить один раз для каждого используемого ключа" bcrypt работает в два этапа:

Этап 1:

Функция под названием EksBlowfishSetup настраивается с использованием желаемой стоимости, соли и пароля для инициализации состояния eksblowfish . Затем bcrypt тратит много времени на выполнение дорогостоящего расписания ключей, которое состоит из выполнения деривации ключа, когда мы получаем набор подключаемых ключей из первичного ключа. Здесь пароль используется как первичный ключ. В случае, если пользователь выбрал неверный или короткий пароль, мы растягиваем этот пароль/ключ на более длинный пароль/ключ. Вышеупомянутая практика также известна как растяжка клавиш.

На этом первом этапе мы продвигаем усиление ключей для замедления вычислений, что, в свою очередь, замедляет работу злоумышленников.

Этап 2:

К полученному хешу добавляется префикс $ 2 a$ , $ 2 y$ или $ 2 b$ . Префиксы добавляются для обозначения использования bcrypt и его версии.

Результат bcrypt обеспечивает основные свойства функции безопасного пароля, как это определено ее разработчиками:

  • Он устойчив к прообразам.
  • Пространство соли достаточно велико, чтобы смягчить атаки с предварительным вычислением, такие как радужные таблицы.
  • У него адаптируемая стоимость.

Разработчики bcrypt считают, что эта функция сохранит свою силу и ценность на долгие годы. Его математический дизайн дает криптографам уверенность в его устойчивости к атакам.

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

Рекомендации по bcrypt

Задача инженеров по безопасности — решить, какую стоимость установить для функции. Эта стоимость также известна как фактор работы. OWASP рекомендует в качестве общего практического правила для настройки коэффициента работы настроить стоимость таким образом, чтобы функция работала как можно медленнее, не влияя на работу пользователей и не увеличивая потребность в использовании дополнительного оборудования, которое может превышать бюджет.

Давайте подробнее рассмотрим пример, основанный на рекомендациях OWASP:

  • Проведите исследование UX, чтобы определить приемлемое время ожидания пользователей для регистрации и аутентификации.
  • Если допустимое время ожидания составляет 1 секунду, настройте стоимость bcrypt так, чтобы он выполнялся на вашем оборудовании за 1 секунду.
  • Проанализируйте вместе со своей командой безопасности, достаточно ли времени вычислений для смягчения последствий и замедления атак.

Пользователи могут подождать 1–2 секунды, так как им не нужно постоянно проходить аутентификацию. Процесс все еще можно было бы воспринимать как быстрый. Принимая во внимание, что эта задержка может помешать злоумышленнику быстро вычислить радужную таблицу.

Возможность регулировать стоимость bcrypt позволяет нам масштабироваться за счет оптимизации оборудования. Согласно современному определению закона Мура, количество транзисторов на квадратный дюйм в интегрированных системах удваивается примерно каждые 18 месяцев. Через 2 года мы могли бы увеличить фактор стоимости, чтобы приспособиться к любым изменениям. Однако с этим нужно быть осторожным: если мы просто увеличим коэффициент работы bcrypt в нашем коде, все будут заблокированы. В этом случае необходим процесс миграции.

Отправить твит

В качестве примера того, как увеличение коэффициента работы увеличивает рабочее время, я создал скрипт Node.js, который вычислял хэш DFGh5546 * % ^ __90, используя стоимость от 10 до 20.

В следующем разделе мы более подробно рассмотрим реализацию Node.js. Скрипт был запущен на MacBook Pro 2017 года со следующими характеристиками (на Auth0 мы получаем отличное оборудование! Присоединяйтесь к нам!):

  • Процессор: Intel Core i7 с тактовой частотой 2,8 ГГц.
  • Память: 16 ГБ LPDDR3, 2 133 МГц
  • Графика: Radeon Pro 555 2048 МБ, Intel HD Graphics 630 1536 МБ

Вот результаты:

Построив эти данные в Wolfram Alpha для построения графика наименьших квадратов, мы заметили, что время хеширования пароля растет экспоненциально по мере увеличения стоимости в этой конкретной конфигурации оборудования:

Для этого набора данных Wolfram Alpha дает нам следующее уравнение наилучшего соответствия методом наименьших квадратов:

Если бы мы хотели предсказать, сколько времени потребуется для хэширования пароля в этой системе при стоимости 30 , мы могли бы просто подставить это значение вместо x :

Расчет коэффициента стоимости 30 может занять 4 437 046 1014,7 миллисекунд. То есть 739507,68 минут или 513,55 дней! Гораздо более быстрая машина, оптимизированная с использованием новейших и лучших технологий, доступных сегодня, могла бы иметь меньшее время вычислений. Тем не менее, bcrypt может легко масштабировать наш процесс хеширования, чтобы приспособиться к более быстрому оборудованию, оставляя нам много места для маневра, чтобы злоумышленники не могли воспользоваться будущими улучшениями технологии.

Если компания когда-либо обнаруживает или подозревает, что утечка данных привела к компрометации паролей, даже в виде хэша, она должна предложить своим пользователям немедленно изменить свой пароль. В то время как хэширование и соление предотвращают успешную атаку методом перебора, состоящую из миллиардов попыток, взлом одного пароля вполне возможен с вычислительной точки зрения. Злоумышленник может с огромной вычислительной мощностью или просто по счастливой случайности взломать один пароль, но даже в этом случае процесс, безусловно, будет медленным из-за характеристик bcrypt, что даст компании и ее пользователям драгоценное время для смены паролей. .

Теперь, когда мы поняли, как работает bcrypt, давайте рассмотрим, как его можно реализовать в веб-приложении на высоком уровне.

Реализация bcrypt

Мы собираемся изучить его реализацию с помощью Node.js и его популярной реализации node.bcrypt.js. Вам не нужно создавать проект Node.js.Цель этого раздела — показать общие шаги, которые должны предпринять разработчики при интеграции bcrypt в свою серверную часть.

узел . бкрипт . js устанавливается через npm , менеджер пакетов Node.js с помощью следующей команды:

Затем в файле точки входа для сервера, таком как app . js мы создаем набор переменных, на которые можно ссылаться во время реализации:

bcrypt предоставляет нам доступ к библиотеке Node.js, в которой есть служебные методы для облегчения процесса хеширования. saltRounds представляет стоимость или фактор работы. Для примера мы будем использовать случайный пароль, plainTextPassword1.

Эта реализация Node.js интересна тем, что дает нам два разных метода хеширования паролей. Давайте изучим их.

Прием 1. Создание соли и хэша для отдельных вызовов функций.

Используя шаблон Promise для управления асинхронным характером JavaScript, в этом методе мы сначала создаем соль через bcrypt . Функция genSalt, которая принимает стоимость, saltRounds. В случае успеха мы получаем солт-значение, которое затем передаем в bcrypt. hash вместе с паролем, plainTextPassword1, который мы хотим хэшировать. Успех bcrypt. hash предоставляет нам хэш, который нам нужно сохранить в нашей базе данных. В полной реализации мы также хотели бы сохранить имя пользователя вместе с хэшем на этом последнем шаге.

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

При первом запуске я получил следующие результаты в командной строке:

Вы не сможете воспроизвести эти результаты снова, поскольку соль выбирается случайным образом при каждом запуске genSalt. Запустив его снова, я получил следующий вывод:

Следовательно, каждый пароль, который мы хешируем, будет иметь уникальную соль и уникальный хэш. Как мы узнали ранее, это помогает нам значительно смягчить атаки радужных таблиц.

Прием 2. Автоматическое создание соли и хэша

В этой версии мы используем одну функцию для создания соли и хеширования пароля:

Этот метод занимает меньше места и может быть проще в тестировании. Опять же, новый хэш создается каждый раз при запуске функции, независимо от того, является ли пароль одним и тем же.

Обратите внимание, что в обоих случаях мы сохраняем хэш, а не пароль. Сам пароль пользователя не должен храниться нигде в виде открытого текста.

После того как хэши паролей будут сохранены в базе данных, как нам проверить логин пользователя? Давайте проверим это.

Проверка пароля с помощью хэша

Использование bcrypt . hash, давайте посмотрим, как мы можем сравнить предоставленный пароль с сохраненным хешем. Поскольку в этом примере мы не подключаемся к базе данных, мы создадим хэш и сохраним его где-нибудь, например, в текстовом редакторе. Хэш, который я получил:

$ 2 b$ 10 $ 69 SrwAoAUNC5F . gtLEvrNON6VQ5EX89vNqLEqU655Oy9PeT / HRM / a .

Далее мы проверим пароли и посмотрим, насколько они совпадают. Во-первых, мы проверяем, совпадает ли наш сохраненный хэш с хешем предоставленного пароля:

В этом случае res имеет значение true , что указывает на то, что предоставленный пароль после хэширования соответствует сохраненному хэшу.

Наоборот, мы ожидаем получить false для res, если проверим хэш на plainTextPassword2 :

И, по сути, res равно false. Однако мы не хранили соль, так как же работает bcrypt . сравнить знаете, какую соль использовать? Глядя на предыдущий результат хэша/соли, обратите внимание, что хеш — это соль с добавленным к ней хэшем:

bcrypt . Compare выводит соль из хэша и затем может правильно хэшировать предоставленный пароль для сравнения.

Это процесс использования bcrypt в Node.js. Этот пример очень тривиален, и есть много других вещей, о которых нужно позаботиться, таких как сохранение имени пользователя, обеспечение безопасности всего серверного приложения, выполнение тестов безопасности для поиска уязвимостей. Хотя хеширование пароля необходимо, это всего лишь небольшая часть надежной стратегии безопасности.

Другие языки будут следовать аналогичному рабочему процессу:

Упрощение управления паролями с помощью Auth0

Основная идея проверки пароля состоит в том, чтобы сравнить два хэша и определить, совпадают ли они друг с другом. Процесс очень сложный. Надежная стратегия идентификации требует, чтобы организация была в курсе последних достижений в области криптографии, разработала процесс поэтапного отказа от устаревших или уязвимых алгоритмов, провела тестирование на проникновение, вложила средства в физическую и сетевую безопасность и многое другое. С учетом всех факторов это непросто и недешево.

Вы можете свести к минимуму накладные расходы на хеширование, добавление соли и управление паролями с помощью Auth0. Мы решаем самые сложные случаи использования удостоверений с помощью расширяемой и простой в интеграции платформы, которая ежемесячно обеспечивает безопасность миллиардов входов в систему.

Auth0 помогает предотвратить попадание важных идентификационных данных в чужие руки.Мы никогда не храним пароли в открытом виде. Пароли всегда хешируются и солятся с помощью bcrypt. Мы встроили в наш продукт самые современные средства безопасности, чтобы защитить ваш бизнес и ваших пользователей.

Сделайте Интернет безопаснее, зарегистрируйте бесплатную учетную запись Auth0 сегодня.

Дэн Ариас

Инженер по исследованиям и разработкам

Привет! 🤠 Я занимаюсь исследованием технологий в Auth0, уделяя особое внимание безопасности и идентификации, и разрабатываю приложения, чтобы продемонстрировать преимущества или недостатки таких технологий. Я также участвую в разработке наших SDK, документации и систем проектирования, таких как Cosmos.

Большая часть моей инженерной работы связана с AWS, React и Node, но мои исследования и разработка контента связаны с широким кругом тем, таких как Golang, производительность и криптография. Кроме того, я являюсь одним из основных сопровождающих этого блога. Ведение блога с более чем 600 000 уникальных посетителей в месяц — довольно сложная задача!

Я был клиентом Auth0 до того, как стал сотрудником, и мне всегда нравилось, насколько проще реализовать аутентификацию с помощью Auth0. Хотите попробовать? Зарегистрируйте бесплатный аккаунт ⚡️.

Дэн Ариас

Инженер по исследованиям и разработкам

Привет! 🤠 Я занимаюсь исследованием технологий в Auth0, уделяя особое внимание безопасности и идентификации, и разрабатываю приложения, чтобы продемонстрировать преимущества или недостатки таких технологий. Я также участвую в разработке наших SDK, документации и систем проектирования, таких как Cosmos.

Большая часть моей инженерной работы связана с AWS, React и Node, но мои исследования и разработка контента связаны с широким кругом тем, таких как Golang, производительность и криптография. Кроме того, я являюсь одним из основных сопровождающих этого блога. Ведение блога с более чем 600 000 уникальных посетителей в месяц — довольно сложная задача!

Я был клиентом Auth0 до того, как стал сотрудником, и мне всегда нравилось, насколько проще реализовать аутентификацию с помощью Auth0. Хотите попробовать? Зарегистрируйте бесплатный аккаунт ⚡️.

Читайте также: