Загрузка...

Хэширование паролей с помощью Hash API

Тема в разделе Backend создана пользователем Hangman666 13 июн 2016. 487 просмотров

Загрузка...
  1. Hangman666
    Hangman666 Автор темы 13 июн 2016 Хранитель Идей 342 10 мар 2016
    На данный момент использование 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); // работает, но не надёжно

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

    Код
    $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);

    Вот и всё!

    password_verify()
    Теперь, когда вы знаете как генерировать хэш, давайте посмотрим на то, как осуществлять проверку.

    Функция password_verify() принимает пароль в обычном виде и его хэш. В зависимости от результатов проверки, возвращает true или false.

    Код
    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]);
    }

    Данную операцию можно делать при входе пользователя в систему, ведь только тогда у нас есть доступ к паролю в явном виде.

    password_get_info()
    password_get_info() возвращает параметры хэширования:

    • algo – константа с названием алгоритма
    • algoName – название алгоритма
    • options – различные настройки
    Заключение
    Новый API для хэширования паролей очень прост. Это отличная замена функции crypt(). Если вам на сервере доступна версия PHP 5.5, то мы рекомендую воспользоваться данным API.
     
  2. lebedev_inactive32574
    lebedev_inactive32574 13 июн 2016 Заблокирован(а) 41 21 янв 2016
    Я вот если честно не слишком сильно разбираюсь в современном шифровании и поэтому мне интересно. А какой смысл в этих изменениях? Ведь по сути это уже устаревшие всё механизмы и временные меры. Я понимаю саму прелестность сути открытых ключей, но ведь вся сложность их дешифровки заключается всего лишь в знании алгоритмов шифрования и вычислительной мощности взломщика.
    Я немного почитываю порой по данной тематике, но никак не могу уловить суть, зачем идти по этому изначально гибельному пути, который исчерпает себя как только огромные вычислительные мощности станут широкодоступны. Может я чего не понимаю, объясните?
     
  3. Hangman666
    Hangman666 Автор темы 13 июн 2016 Хранитель Идей 342 10 мар 2016
    Ну суть именно усиление шифровки!!!
    Ведь для расшифровки нужно время, а если все будет хорошо зашифровано то соответственно нужно будет больше времениина расшифровку!
     
  4. Hangman666
    Hangman666 Автор темы 13 июн 2016 Хранитель Идей 342 10 мар 2016
    Ведь если один человек зашифровал, в любом случае найдется тот кто расшифрует.
    Нет абсолютной защиты данных!просто каждый стремиться улучшить защиту.
     
  5. lebedev_inactive32574
    lebedev_inactive32574 13 июн 2016 Заблокирован(а) 41 21 янв 2016
    Об этом я и упомянул написав про мощности взломщика, то есть всё как и раньше упирается тупо во время "взлома". Я говорю, я конечно не профи в данной сфере, но помоему сам принцип открытых ключей, в своём современном виде полностью исчерпал себя и скоро вообще умрёт, учитывая скорость развития современных технологий.
     
  6. lebedev_inactive32574
    lebedev_inactive32574 13 июн 2016 Заблокирован(а) 41 21 янв 2016
    У меня даже складывается впечатление, что хранить пароли по старинке в незашифрованном виде, но пароли сложные, становится безопаснее чем зашифрованные пароли, учитывая использование взломщиками тех же радужных таблиц :)
     
  7. Hangman666
    Hangman666 Автор темы 13 июн 2016 Хранитель Идей 342 10 мар 2016

    Да к сожалению все упирается только во время!
     
Top