На данный момент использование bcrypt - это лучший способ хэширования паролей, однако множество разработчиков по старинке используют MD5 и SHA1. Многие из них, не применяют технику добавления соли. В PHP 5.5 решили акцентировать внимание разработчиков на алгоритме bcrypt и создали специальный хэш API. Хэш API состоит из следующих функций: password_hash() – для генерации хэша пароля. password_verify() – проверка пароля. password_needs_rehash() – используется когда нужно перегенерировать хэш. password_get_info() – возвращает название алгоритма и другую информацию. password_hash() Использование функции crypt() у многих вызывает ступор из-за сложности, поэтому вместо неё применяются упрощённые способы создания хэша. К примеру: $hash = md5($password . $salt); // работает, но не надёжно Код $hash = md5($password . $salt); // работает, но не надёжно Функция password_hash() упрощает этот процесс настолько, насколько это возможно. Если вам нужно создать хэш пароля, вызовите эту функцию и запишите значение в базу данных. $hash = password_hash($passwod, PASSWORD_DEFAULT); Код $hash = password_hash($passwod, PASSWORD_DEFAULT); Вот и всё! Первый параметр - это строка представляющая собой пароль; второй - алгоритм, который будет применён. Алгоритм, который используется по умолчанию - bcrypt, но в будущем будут добавлены и другие, более продвинутые алгоритмы. Если вы используете PASSWORD_DEFAULT, то знайте, что на выходе получите строку из более 60 символов. Она может быть и больше, особенно, при использовании других алгоритмов, так что в таблице размер поля можете выставить 255. В качестве второго параметра, вы можете использовать константу PASSWORD_BCRYPT. В этом случае, размер строки на выходе будет ровно 60 символов. Важно понять, что вам самим не нужно передавать соль или параметр cost (стоимость - количество раундов подготовки ключей). Новый API сделает это за вас. Но если же вы хотите сами задать данные параметры, то можете сделать это следующим образом. $options = [ 'salt' => custom_function_for_salt(), //напишите свою функцию генерации соли 'cost' => 12 // по умолчанию равен 10 ]; $hash = password_hash($password, PASSWORD_DEFAULT, $options); Код $options = [ 'salt' => custom_function_for_salt(), //напишите свою функцию генерации соли 'cost' => 12 // по умолчанию равен 10 ]; $hash = password_hash($password, PASSWORD_DEFAULT, $options); Вот и всё! password_verify() Теперь, когда вы знаете как генерировать хэш, давайте посмотрим на то, как осуществлять проверку. Функция password_verify() принимает пароль в обычном виде и его хэш. В зависимости от результатов проверки, возвращает true или false. if (password_verify($password, $hash)) { // Успех! } else { // Провал } Код if (password_verify($password, $hash)) { // Успех! } else { // Провал } Заметьте, что соль находится в самом хэше, так что нам не нужно указывать её вручную. password_needs_rehash() Что если вам необходимо обновить параметры соли или стоимости? Или изменились настройки хэширования PHP? В этом случае, можете воспользоваться функцией password_needs_rehash() для проверки данного факта. if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 12])) { // необходимо создать хэш пароля ещё раз $hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]); } Код if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 12])) { // необходимо создать хэш пароля ещё раз $hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]); } Данную операцию можно делать при входе пользователя в систему, ведь только тогда у нас есть доступ к паролю в явном виде. password_get_info() password_get_info() возвращает параметры хэширования: algo – константа с названием алгоритма algoName – название алгоритма options – различные настройки Заключение Новый API для хэширования паролей очень прост. Это отличная замена функции crypt(). Если вам на сервере доступна версия PHP 5.5, то мы рекомендую воспользоваться данным API.
Я вот если честно не слишком сильно разбираюсь в современном шифровании и поэтому мне интересно. А какой смысл в этих изменениях? Ведь по сути это уже устаревшие всё механизмы и временные меры. Я понимаю саму прелестность сути открытых ключей, но ведь вся сложность их дешифровки заключается всего лишь в знании алгоритмов шифрования и вычислительной мощности взломщика. Я немного почитываю порой по данной тематике, но никак не могу уловить суть, зачем идти по этому изначально гибельному пути, который исчерпает себя как только огромные вычислительные мощности станут широкодоступны. Может я чего не понимаю, объясните?
Ну суть именно усиление шифровки!!! Ведь для расшифровки нужно время, а если все будет хорошо зашифровано то соответственно нужно будет больше времениина расшифровку!
Ведь если один человек зашифровал, в любом случае найдется тот кто расшифрует. Нет абсолютной защиты данных!просто каждый стремиться улучшить защиту.
Об этом я и упомянул написав про мощности взломщика, то есть всё как и раньше упирается тупо во время "взлома". Я говорю, я конечно не профи в данной сфере, но помоему сам принцип открытых ключей, в своём современном виде полностью исчерпал себя и скоро вообще умрёт, учитывая скорость развития современных технологий.
У меня даже складывается впечатление, что хранить пароли по старинке в незашифрованном виде, но пароли сложные, становится безопаснее чем зашифрованные пароли, учитывая использование взломщиками тех же радужных таблиц :)