Время от времени я слышу совет: «Используйте bcrypt для хранения паролей в PHP, правила bcrypt».
А что есть bcrypt
? PHP не предлагает никаких таких функций, Википедия болтает о утилите шифрования файлов, а поиски в Интернете показывают лишь несколько реализаций Blowfish на разных языках. Теперь Blowfish также доступен в PHP через mcrypt
, но как это поможет с хранением паролей? Blowfish - это шифр общего назначения, он работает двумя способами. Если он может быть зашифрован, он может быть расшифрован. Пароли нуждаются в односторонней функции хеширования.
Какое объяснение?
bcrypt
это односторонний хэш - алгоритм по сравнению со схемой шифрования в моем ответе . Существует целое заблуждение, чтоbcrypt
это просто Blowfish, когда на самом деле он имеет совершенно другое расписание ключей, которое гарантирует, что простой текст не может быть восстановлен из текста шифра, не зная начального состояния шифра (соль, раунды, ключ).Ответы:
bcrypt
алгоритм хеширования, который масштабируется с помощью аппаратного обеспечения (с помощью настраиваемого количества раундов). Его медлительность и многократные обходы гарантируют, что злоумышленник должен развернуть огромные средства и оборудование, чтобы иметь возможность взломать ваши пароли. Добавьте к этому соли для каждого пароля (bcrypt
REQUIRES солей), и вы можете быть уверены, что атака практически невозможна без смехотворного количества средств или оборудования.bcrypt
использует алгоритм Eksblowfish для хеширования паролей. В то время как этап шифрования Eksblowfish и Blowfish абсолютно одинаков, фаза расписания ключей Eksblowfish гарантирует, что любое последующее состояние зависит как от соли, так и от ключа (пароля пользователя), и никакое состояние не может быть предварительно вычислено без знания обоих. Из-за этого ключевого различия,bcrypt
алгоритм одностороннего хэширования. Вы не можете получить простой текстовый пароль, не зная соль, раунды и ключ (пароль). [ Источник ]Как использовать bcrypt:
Использование PHP> = 5.5-DEV
Функции хеширования паролей теперь встроены непосредственно в PHP> = 5.5 . Теперь вы можете использовать
password_hash()
для созданияbcrypt
хэша любой пароль:Чтобы проверить предоставленный пользователем пароль по существующему хешу, вы можете использовать
password_verify()
так:Используя PHP> = 5.3.7, <5.5-DEV (также RedHat PHP> = 5.3.3)
Существует библиотека совместимости на GitHub создан на основе исходного кода из указанных выше функций , первоначально написанных на C, что обеспечивает такую же функциональность. Как только библиотека совместимости установлена, ее использование такое же, как указано выше (за исключением сокращенной записи массива, если вы все еще находитесь в ветке 5.3.x).
Использование PHP <5.3.7 (УСТАРЕЛО)
Вы можете использовать
crypt()
функцию для генерации bcrypt хэшей входных строк. Этот класс может автоматически генерировать соли и проверять существующие хэши по входным данным. Если вы используете версию PHP выше или равную 5.3.7, настоятельно рекомендуется использовать встроенную функцию или библиотеку compat . Эта альтернатива предоставляется только для исторических целей.Вы можете использовать этот код следующим образом:
Кроме того, вы также можете использовать Portable PHP Hashing Framework .
источник
mt_rand()
также отображается с использованием текущего времени и текущего идентификатора процесса. Пожалуйста, смотритеGENERATE_SEED()
в/ext/standard/php_rand.h
.crypt()
проверяется и проверяется тогда. Приведенный выше код вызывает PHPcrypt()
, который вызываетcrypt()
функцию POSIX . Весь код выше делает больше - генерирует случайную соль (которая не должна быть криптографически безопасной, соль не считается секретной) перед вызовомcrypt()
. Может быть, вам следует провести небольшое исследование, прежде чем вызывать волка.crypt()
) подвержен уязвимости безопасности до 5.3.7 и (очень незначительно) неэффективен после 5.3.7 - подробности соответствующей проблемы можно найти здесь . Также обратите внимание, что новый API хеширования паролей ( обратная компат-библиотека ) теперь является предпочтительным методом реализации хеширования паролей bcrypt в вашем приложении.Итак, вы хотите использовать bcrypt? Потрясающие! Однако, как и в других областях криптографии, вы не должны делать это самостоятельно. Если вам нужно беспокоиться о чем-то вроде управления ключами, хранения солей или генерации случайных чисел, вы делаете это неправильно.
Причина проста: так просто обкатать bcrypt . Фактически, если вы посмотрите почти на каждый фрагмент кода на этой странице, вы заметите, что он нарушает хотя бы одну из этих распространенных проблем.
Посмотрим правде в глаза, криптография это сложно.
Оставьте это для экспертов. Оставьте это людям, чья работа состоит в том, чтобы поддерживать эти библиотеки. Если вам нужно принять решение, вы делаете это неправильно.
Вместо этого просто используйте библиотеку. Несколько существуют в зависимости от ваших требований.
Библиотеки
Вот разбивка некоторых из наиболее распространенных API.
PHP 5.5 API - (доступно для 5.3.7+)
Начиная с PHP 5.5, вводится новый API для хеширования паролей. Также есть поддерживаемая мной библиотека совместимости shim для 5.3.7+. Преимущество этого заключается в том, что он проверен и прост в использовании.
На самом деле, он призван быть чрезвычайно простым.
Ресурсы:
Zend \ Crypt \ Password \ Bcrypt (5.3.2+)
Это еще один API, похожий на PHP 5.5 и имеющий аналогичную цель.
Ресурсы:
PasswordLib
Это немного другой подход к хешированию паролей. Вместо того, чтобы просто поддерживать bcrypt, PasswordLib поддерживает большое количество алгоритмов хеширования. Это в основном полезно в тех случаях, когда вам необходимо поддерживать совместимость с устаревшими и разрозненными системами, которые могут находиться вне вашего контроля. Поддерживает большое количество алгоритмов хеширования. И поддерживается 5.3.2+
Ссылки:
PHPASS
Это слой, который поддерживает bcrypt, но также поддерживает довольно сильный алгоритм, который полезен, если у вас нет доступа к PHP> = 5.3.2 ... Он фактически поддерживает PHP 3.0+ (хотя и не с bcrypt).
Ресурсы
Примечание: не используйте альтернативы PHPASS, которые не размещены на openwall, это разные проекты !!!
О компании BCrypt
Если вы заметили, каждая из этих библиотек возвращает одну строку. Это из-за того, как BCrypt работает внутри. И есть тонна ответов об этом. Вот подборка, которую я написал, которую я не буду здесь копировать / вставлять, но буду ссылаться на:
md5
паролей в bcryptЗаворачивать
Есть много разных вариантов. Что вы выбираете, зависит от вас. Тем не менее, я НАСТОЯТЕЛЬНО рекомендую вам использовать одну из перечисленных выше библиотек для решения этой проблемы.
Опять же, если вы используете
crypt()
напрямую, вы, вероятно, делаете что-то не так. Если ваш код используетhash()
(илиmd5()
илиsha1()
) напрямую, вы почти наверняка делаете что-то не так.Просто используйте библиотеку ...
источник
mt_rand()
имеет достаточно высокий период, но начальное значение составляет всего 32 бита. Таким образом, использованиеmt_rand()
эффективно ограничивает вас только 32 битами энтропии. Который благодаря проблеме дня рождения означает, что у вас есть 50% -й шанс столкновения только на 7 000 сгенерированных солей (глобально). Так какbcrypt
принимает 128 битов соли, лучше использовать источник, который может предоставить все 128 битов ;-). (при 128 битах вероятность столкновения составляет 50% при хеше 2e19) ...mt_rand
иuniqid
(и, следовательно,lcg_value
иrand
) не первый выбор ...Вы получите достаточно информации в «Радужных таблицах»: что нужно знать о безопасных схемах паролей или портативной среде хеширования паролей PHP .
Цель состоит в том, чтобы хешировать пароль с чем-то медленным, так что кто-то, получающий вашу базу паролей, умрет, пытаясь его взломать (задержка в 10 мс для проверки пароля - ничто для вас, много для того, кто пытается его взломать). Bcrypt медленный и может использоваться с параметром, чтобы выбрать, насколько он медленный.
источник
Вы можете создать односторонний хеш с помощью bcrypt, используя
crypt()
функцию PHP и передавая соответствующую соль Blowfish. Наиболее важным из всего уравнения является то, что A) алгоритм не был скомпрометирован и B) вы правильно заполняете каждый пароль . Не используйте соль для всего применения; это открывает все ваше приложение для атаки из одного набора таблиц Rainbow.PHP - функция Crypt
источник
crypt()
функцию PHP , которая поддерживает несколько различных функций хеширования паролей. Убедитесь, что вы не используетеCRYPT_STD_DES
илиCRYPT_EXT_DES
- любой из других поддерживаемых типов в порядке (и включает bcrypt, под именемCRYPT_BLOWFISH
).crypt
предоставляет несколько хэшей паролей, причем bcrypt соответствуетCRYPT_BLOWFISH
константе. Bcrypt в настоящее время является самым мощным алгоритмом, поддерживаемым,crypt
а некоторые другие, которые он поддерживает, довольно слабые.Изменить: 2013.01.15 - Если ваш сервер будет поддерживать его, используйте вместо этого решение martinstoeckli .
Каждый хочет сделать это более сложным, чем оно есть. Функция crypt () выполняет большую часть работы.
Пример:
Я знаю, что это должно быть очевидно, но, пожалуйста, не используйте «пароль» в качестве пароля.
источник
2y
вместо2a
.mcrypt_create_iv($size, MCRYPT_DEV_URANDOM)
качестве источника для соли.bcrypt
использует.mcrypt_create_iv(17, MCRYPT_DEV_URANDOM)
,str_replace('+', '.', base64_encode($rawSalt))
,$salt = substr($salt, 0, 22);
Версия 5.5 PHP будет иметь встроенную поддержку BCrypt, функции
password_hash()
иpassword_verify()
. На самом деле это всего лишь обертки вокруг функцииcrypt()
, и они облегчат ее правильное использование. Он заботится о генерации безопасной случайной соли и обеспечивает хорошие значения по умолчанию.Самый простой способ использовать эти функции:
Этот код хеширует пароль с помощью BCrypt (алгоритм
2y
), генерирует случайную соль из случайного источника ОС и использует параметр стоимости по умолчанию (на данный момент это 10). Вторая строка проверяет, соответствует ли введенный пользователем пароль уже сохраненному хеш-значению.Если вы хотите изменить параметр стоимости, вы можете сделать это следующим образом, увеличив параметр стоимости на 1, удвоив необходимое время для вычисления значения хеш-функции:
В отличие от
"cost"
параметра, лучше не указывать"salt"
параметр, потому что функция уже делает все возможное для создания криптографически безопасной соли.Для PHP версии 5.3.7 и новее существует пакет совместимости от того же автора, который создал эту
password_hash()
функцию. Для PHP версий до 5.3.7 нет поддержкиcrypt()
с2y
, алгоритмом юникода безопасного Bcrypt. Вместо этого можно заменить его на2a
, что является лучшей альтернативой для более ранних версий PHP.источник
Современное мышление: хэши должны быть самыми медленными, а не самыми быстрыми. Это подавляет атаки радужного стола .
Также связано, но предосторожно: у злоумышленника никогда не должно быть неограниченного доступа к вашему экрану входа. Чтобы предотвратить это: настройте таблицу отслеживания IP-адресов, которая будет записывать каждое попадание вместе с URI. Если более пяти попыток входа в систему происходит с одного и того же IP-адреса в течение любого пятиминутного периода, заблокируйте объяснение. Вторичный подход - иметь двухуровневую схему паролей, как это делают банки. Установка блокировки для сбоев на втором проходе повышает безопасность.
Резюме: замедлите атакующего, используя трудоемкие хэш-функции. Кроме того, заблокируйте слишком много обращений к вашей учетной записи и добавьте второй уровень паролей.
источник
Вот обновленный ответ на этот старый вопрос!
Правильный способ хэширования паролей в PHP начиная с 5.5 - с
password_hash()
, и правильный способ их проверки - с помощьюpassword_verify()
, и это все еще верно в PHP 8.0. Эти функции по умолчанию используют хеши bcrypt, но были добавлены другие более сильные алгоритмы. Вы можете изменить коэффициент работы (эффективно, насколько "сильное" шифрование) с помощьюpassword_hash
параметров.Однако, хотя он все еще достаточно силен, bcrypt больше не считается современным ; появился улучшенный набор алгоритмов хеширования паролей под названием Argon2 , с вариантами Argon2i, Argon2d и Argon2id. Разница между ними (как описано здесь ):
Поддержка Argon2i была добавлена в PHP 7.2, и вы запрашиваете ее следующим образом:
и поддержка Argon2id была добавлена в PHP 7.3:
Никаких изменений не требуется для проверки паролей, так как результирующая строка хеша содержит информацию о том, какой алгоритм, соль и рабочие факторы использовались при его создании.
Совершенно отдельно (и несколько избыточно), libsodium (добавлено в PHP 7.2) также обеспечивает Argon 2 хэширование с помощью
sodium_crypto_pwhash_str ()
иsodium_crypto_pwhash_str_verify()
функций, которые работают примерно так же, как PHP Модульное. Одной из возможных причин их использования является то, что PHP иногда может быть скомпилирован без libargon2, что делает алгоритмы Argon2 недоступными для функции password_hash; В PHP 7.2 и выше всегда должен быть включен libsodium, но это может и не произойти - но по крайней мере есть два способа использования этого алгоритма. Вот как вы можете создать хеш Argon2id с помощью libsodium (даже в PHP 7.2, в котором иначе отсутствует поддержка Argon2id)):Обратите внимание, что он не позволяет указать соль вручную; это часть принципа libsodium - не позволяйте пользователям устанавливать параметры в значения, которые могут поставить под угрозу безопасность - например, ничто не мешает вам передавать пустую солт-строку в
password_hash
функцию PHP ; libsodium не позволяет тебе делать глупости!источник
Для паролей OAuth 2 :
источник
Как мы все знаем, хранение пароля в виде открытого текста в базе данных небезопасно. bcrypt - это метод хеширования паролей. Он используется для обеспечения безопасности паролей. Одна из замечательных функций bcrypt - это спасение нас от хакеров, которые используются для защиты пароля от хакерских атак, поскольку пароль хранится в зашифрованном виде.
функция password_hash () используется для создания нового хэша пароля. Он использует надежный и надежный алгоритм хеширования. Функция password_hash () очень совместима с функцией crypt (). Поэтому хэши паролей, созданные crypt (), могут использоваться с password_hash () и наоборот. Функции password_verify () и password_hash () просто обертывают вокруг функции crypt (), и они значительно упрощают ее точное использование.
СИНТАКСИС
Следующие алгоритмы в настоящее время поддерживаются функцией password_hash ():
PASSWORD_DEFAULT PASSWORD_BCRYPT PASSWORD_ARGON2I PASSWORD_ARGON2ID
Параметры: эта функция принимает три параметра, как указано выше и описано ниже:
пароль : хранит пароль пользователя. algo : Это константа алгоритма пароля, которая используется непрерывно при обозначении алгоритма, который должен использоваться при хешировании пароля. Опции : это ассоциативный массив, который содержит опции. Если это будет удалено и не включает, будет использоваться случайная соль, и произойдет использование стоимости по умолчанию. Возвращаемое значение : возвращает хешированный пароль в случае успеха или False в случае неудачи.
Пример :
Ниже программы иллюстрируют функцию password_hash () в PHP:
ВЫВОД
источник