Hash API - новый подход к шифрованию паролей.
Даже в современное время многие до сих пор используют старые способы шифрования, подвергая опасности свои данные, а функция crypt() для некоторых слишком сложна в использовании. Чтобы это исправить, в PHP 5.5 был введён Hash API, о котором мы и поговорим в этой статье.
Hash API - это просто некий интерфейс, облегчающий использование функции crypt(). Давайте рассмотрим его функции.
password_hash()
Функция password_hash() принимает строку первым параметром и константу вторым.
<?php
$hash = password_hash("mystring", PASSWORD_DEFAULT);
?>
Если в качестве второго параметра вы укажете PASSWORD_DEFAULT, то на выходе получите хэш из более 60 символов, а если укажете PASSWORD_BCRYPT, то ровно 60 символов.
Hash API сам заботится о соли и стоимости, но если вы хотите указать какие-то свои значения, то сделать это можно так
<?php
function salt_function() {
return "mysaltstringfrom22symbols";
}
$opt = array('salt' => salt_function(), 'cost' => 11);
$hash = password_hash("mystring", PASSWORD_DEFAULT, $opt);
?>
Мы создали ассоциативный массив опций, где указали соль, которую возвращает наша функция, и стоимость. В качестве примера я создал простую фунцию, которая возвращает какую-то строку, но, конечно же, у вас код может быть намного сложнее. Главное, чтобы возвращаемая строка была как минимум из 22 символов, иначе будет ошибка. Вторым элементом массива у нас стоимость(cost). По-умолчанию она равна 10, но чем больше данное значение, тем лучше защита, однако не стоит ставить слишком много, т.к. это может существенно понизить скорость работы скрипта. Когда всё готово, данный массив передаётся третим параметров в нашу функцию password_hash().
password_verify()
Если вам нужно проверить исходную строку и хэш, используйте password_verify().
<?php
if(password_verify("mystring", $hash)) {
echo "TRUE";
} else {
echo "FALSE";
}
?>
Тут, думаю, объяснять особо нечего. Пойдём дальше.
password_needs_rehash()
Эта функция используется, когда вам нужно обновить параметры соли или стоимости. password_needs_rehash() проверяет, соответствует ли данный хэш заданному алгоритму и опциям. Если нет, то его нужно обновить.
<?php
if(password_needs_rehash($hash, PASSWORD_DEFAULT, $opt)) {
$hash = password_hash($pass, PASSWORD_DEFAULT, $opt);
}
?>
password_get_info()
Эта фунция просто возвращает массив параметров хэширования.
<?php
$arr = password_get_info($hash);
?>
Вернётся ассоциативный массив с такими значениями:
- algo - константа алгоритма
- algoName - имя алгоритма
- options - опции
Итак, на этом всё. Как видите, использовать Hash API очень даже несложно, так что, если у вас версия
PHP 5.5+, то советую использовать именно этот способ шифрования.
-
- Михаил Русаков
Комментарии (7):
Якщо не хочете використовувати бету - користуйтеся таким: https://gist.github.com/marcoarment/1053158
Ответить
Михаил скажите, а что такое соль и стоимость?
Ответить
Сергей, здравствуйте. Давайте представим, что мы хэшируем пароли функцией MD5. Человек при регистрации может ввести какой-нибудь простой и/или короткий пароль и вот хэши таких паролей не составит труда подобрать, ибо существует уже огромная база таких паролей и, соответственно, их хэшей. Чтобы решить данную проблему, была придумана соль. Соль — это набор случайных символов, который каждый раз перед прохождением через хеш-функцию добавляется к паролю. При регистрации пользователя генерируется случайная соль, на основе которой и указанного пароля генерируется «соленый» хеш. И базы, содержащие хэши известных паролей, уже не помогут хакеру, т.к. невозможно учитывать комбинации всех паролей и солей. Стоимость - количество раундов подготовки ключей. Подробнее Вы можете узнать это, если почитаете про криптографию.
Ответить
если я правильно понял то хеш hasgfhst+соль(afasfa) так то есть к хешу добавляется случайно сгенерированная строка?
Ответить
Да. Существует много баз, где можно ввести хэш и узнать пароль, но если вы к паролю, введённому, например, пользователем при регистрации добавите ещё какую-нибудь строку и захэшируете, то такой пароль расшифровать будет намного сложнее
Ответить
С генерацией понятно, а как быть проверкой? Сейчас я хэширую пароль при регистрации, а при авторизации опять хэширую пароль и сверяю с базой. А с солью как быть, если она генерируется? Хранить в БД?
Ответить
Да, вы можете хранить ее в базе данных, а затем с ней проверять.
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.