Загрузка...

Password hashing with the Hash API

Thread in Backend created by Hangman666 Jun 13, 2016. 525 views

  1. Hangman666
    Hangman666 Topic starter Jun 13, 2016 Хранитель Идей 342 Mar 10, 2016
    На данный момент использование bcrypt - это лучший способ хэширования паролей, однако множество разработчиков по старинке используют MD5 и SHA1. Многие из них, не применяют технику добавления соли. В PHP 5.5 решили акцентировать внимание разработчиков на алгоритме bcrypt и создали специальный хэш API.

    Хэш API состоит из следующих функций:

    • password_hash() – для генерации хэша пароля.
    • password_verify() – проверка пароля.
    • password_needs_rehash() – используется когда нужно перегенерировать хэш.
    • password_get_info() – возвращает название алгоритма и другую информацию.
    password_hash()
    Использование функции crypt() у многих вызывает ступор из-за сложности, поэтому вместо неё применяются упрощённые способы создания хэша. К примеру:

    Code
    $hash = md5($password . $salt); // работает, но не надёжно

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

    Code
    $hash = password_hash($passwod, PASSWORD_DEFAULT);

    Вот и всё! Первый параметр - это строка представляющая собой пароль; второй - алгоритм, который будет применён.

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

    Важно понять, что вам самим не нужно передавать соль или параметр cost (стоимость - количество раундов подготовки ключей). Новый API сделает это за вас. Но если же вы хотите сами задать данные параметры, то можете сделать это следующим образом.

    Code
    $options = [
    'salt' => custom_function_for_salt(), //напишите свою функцию генерации соли
    'cost' => 12 // по умолчанию равен 10
    ];
    $hash = password_hash($password, PASSWORD_DEFAULT, $options);

    Вот и всё!

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

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

    Code
    if (password_verify($password, $hash)) {
    // Успех!
    }
    else {
    // Провал
    }

    Заметьте, что соль находится в самом хэше, так что нам не нужно указывать её вручную.

    password_needs_rehash()
    Что если вам необходимо обновить параметры соли или стоимости? Или изменились настройки хэширования PHP? В этом случае, можете воспользоваться функцией password_needs_rehash() для проверки данного факта.

    Code

    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 Jun 13, 2016 Banned 41 Jan 21, 2016
    Я вот если честно не слишком сильно разбираюсь в современном шифровании и поэтому мне интересно. А какой смысл в этих изменениях? Ведь по сути это уже устаревшие всё механизмы и временные меры. Я понимаю саму прелестность сути открытых ключей, но ведь вся сложность их дешифровки заключается всего лишь в знании алгоритмов шифрования и вычислительной мощности взломщика.
    Я немного почитываю порой по данной тематике, но никак не могу уловить суть, зачем идти по этому изначально гибельному пути, который исчерпает себя как только огромные вычислительные мощности станут широкодоступны. Может я чего не понимаю, объясните?
     
  3. Hangman666
    Hangman666 Topic starter Jun 13, 2016 Хранитель Идей 342 Mar 10, 2016
    Ну суть именно усиление шифровки!!!
    Ведь для расшифровки нужно время, а если все будет хорошо зашифровано то соответственно нужно будет больше времениина расшифровку!
     
  4. Hangman666
    Hangman666 Topic starter Jun 13, 2016 Хранитель Идей 342 Mar 10, 2016
    Ведь если один человек зашифровал, в любом случае найдется тот кто расшифрует.
    Нет абсолютной защиты данных!просто каждый стремиться улучшить защиту.
     
  5. lebedev_inactive32574
    lebedev_inactive32574 Jun 13, 2016 Banned 41 Jan 21, 2016
    Об этом я и упомянул написав про мощности взломщика, то есть всё как и раньше упирается тупо во время "взлома". Я говорю, я конечно не профи в данной сфере, но помоему сам принцип открытых ключей, в своём современном виде полностью исчерпал себя и скоро вообще умрёт, учитывая скорость развития современных технологий.
     
  6. lebedev_inactive32574
    lebedev_inactive32574 Jun 13, 2016 Banned 41 Jan 21, 2016
    У меня даже складывается впечатление, что хранить пароли по старинке в незашифрованном виде, но пароли сложные, становится безопаснее чем зашифрованные пароли, учитывая использование взломщиками тех же радужных таблиц :)
     
  7. Hangman666
    Hangman666 Topic starter Jun 13, 2016 Хранитель Идей 342 Mar 10, 2016

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