Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Хэширование паролей в PHP 5.5 с применением нового API

Anna | 31.05.2014 | нет комментариев
Использование BCrypt является общепризнанным и лучшим методом для хэширования паролей, но огромное число разработчиков по-бывшему применяют ветхие и слабые алгорифмы, как бы MD5 и SHA1. Некоторые разработчики даже не применяют соль для хэширования. Новейший API хэширования в PHP 5.5 ставит своей целью привлечь внимание к BCrypt, упрощая работу с ним. В этой статье я расскажу об основах применения нового API для хеширования в PHP.

Новейший API хэширования паролей предоставляет четыре примитивных функции:

  • password_hash() — применяется для хэширования пароля.
  • password_verify() — применяется для проверки пароля на соответствие хэшу.
  • password_needs_rehash() — применяется для проверки необходимости сделать новейший хэш.
  • password_get_info() — возвращает имя алгорифма хеширования и разные параметры, используемые при хэшировании.

password_hash()

Правда функция crypt() достаточно безвредна, она, по суждению многих, слишком трудная. Некоторые разработчики, Дабы не возиться с ней, применяют слабую соль и слабый алгорифм для генерирования хэша, скажем:

<?php
$hash = md5($password . $salt); // works, but dangerous

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

<?php
$hash = password_hash($passwod, PASSWORD_DEFAULT);

Вот и все! Первым параметром является строка пароля, тот, что нужно захэшировать, а 2-й параметр определяет алгорифм, тот, что должен быть использован для генерирования хэша.

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

Основное тут в том, что вам не необходимо заботиться о значении соли и стоимости вычисления хэша. Новейший API будет делать это за вас. И соль является частью хэша, так что вам не придется беречь его отдельно. Если вы хотите применять вашу собственную соль (либо стоимость вычисления), вы можете сделать это путем передачи третьего довода функции:

<?php
$options = [
    'salt' => custom_function_for_salt(), //write your own code to generate a suitable salt
    'cost' => 12 // the default cost is 10
];
$hash = password_hash($password, PASSWORD_DEFAULT, $options);

Таким образом, Вы будете неизменно идти в ногу с востребованными мерами безопасности. Если PHP позднее примет решение о использовании больше сильного алгорифма хеширования, ваш код может воспользоваться им без изменений.

password_verify()

Сейчас, когда вы видели, как генерировать хэши с новым API, давайте посмотрим, как проверить пароль. Мы легко берем хэш из базы, и пароль, введенный пользователем и передаем их в эту функцию.password_verify() возвращает true, если хэш соответствует указанному паролю.

<?php
if (password_verify($password, $hash)) {
    // Success!
}
else {
    // Invalid credentials
}

Соль является частью хэша и именно следственно нам не придется возиться с ней отдельно.

password_needs_rehash()

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

<?php
if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 12])) {
    // the password needs to be rehashed as it was not generated with
    // the current default algorithm or not created with the cost
    // parameter 12
    $hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]);

    // don't forget to store the new hash!
}

Имейте в виду, что вам необходимо сделать это, когда пользователь авторизуется на сайте, так как это исключительный раз, когда у вас есть доступ к его незашифрованному паролю.

password_get_info()

Функция password_get_info() принимает хэш и возвращает ассоциативный массив из 3 элементов:

  • algo — константа, которая идентифицирует определенный алгорифм
  • algoName — наименование используемого алгорифма
  • options — разные опции, используемые при генерации хэша

Завершение

Новейший API хэширования паролей, безоговорочно, комфортнее, чем возня с crypt(). Если ваш сайт в реальное время работает на PHP 5.5, то я настойчиво рекомендуется применять новое API хэширования. Те, кто применяют PHP 5.3.7 (либо больше новой версии), могут применять библиотеку под наименованиемpassword_compat которая эмулирует это API и механически отключает себя при применении PHP версии 5.5 .

Оригинал

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB