Использование функции password_hash и password_verify PHP 5.5

Скажем, я хотел сохранить пароль для пользователя, будет ли это правильным способом сделать это с помощью функции password_hash() PHP 5.5 (или этой версии для PHP 5.3.7+: https://github.com/ircmaxell/ password_compat )?

 $options = array("cost" => 10, "salt" => uniqid()); $hash = password_hash($password, PASSWORD_BCRYPT, $options); 

Тогда я бы сделал:

 mysql_query("INSERT INTO users(username,password, salt) VALUES($username, $hash, " . $options['salt']); 

Вставить в базу данных.

Затем, чтобы проверить:

 $row = mysql_fetch_assoc(mysql_query("SELECT salt FROM users WHERE id=$userid")); $salt = $row["salt"]; $hash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 10, "salt" => $salt)); if (password_verify($password, $hash) { // Verified } 

Игнорируя проблемы с вашими утверждениями базы данных, я отвечу на вопрос о password_hash .

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

Функция password_hash возвращает строку, содержащую как хэш, так и соль. Так:

 $hashAndSalt = password_hash($password, PASSWORD_BCRYPT); // Insert $hashAndSalt into database against user 

Затем, чтобы проверить:

 // Fetch hash+salt from database, place in $hashAndSalt variable // and then to verify $password: if (password_verify($password, $hashAndSalt)) { // Verified } 

Кроме того, как следует из комментариев, если вы заинтересованы в безопасности, вы можете посмотреть на mysqli ( ext/mysql устарел в PHP5.5), а также эту статью о SQL-инъекции: http://php.net/manual /en/security.database.sql-injection.php

Использование собственной соли не рекомендуется, и с PHP 7 его использование устарело . Чтобы понять, почему, прочитайте мысли автора

Мне стало совершенно ясно, что соль является опасной. Я еще не видел единственного варианта использования соли, который был даже приличным. Каждое использование варьируется от плохого (передавая выход mt_rand ()) на опасные (статические строки) до безумного (передача пароля в качестве собственной соли).

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

Обратите внимание на это из php.net

Предупреждение

Опция salt устарела с PHP 7.0.0. В настоящее время предпочтительнее просто использовать соль, которая генерируется по умолчанию.

Вывод? Забудьте о солевом варианте.

Этого вполне достаточно password_hash('password', PASSWORD_DEFAULT) * (или _BCRYPT)

Вы не должны вводить собственную соль, оставлять соль пустой, функция будет генерировать хорошую случайную соль.

Вставьте в базу данных (или файл или все, что вы используете) всю строку, возвращаемую функцией. он содержит: идентификатор алгоритма, стоимость, соль (22 символа) и хеш-пароль.

Для использования функции password_verify () требуется вся строка. Соль случайна и не вредит попадать в чужие руки (с хэшированным паролем). Это предотвращает (или очень сложно) использование готовых наборов генерируемых списков паролей и хэшей – радужных таблиц.

Вы должны рассмотреть возможность добавления параметра стоимости. Значение по умолчанию (если опущено) равно 10 – если выше, то функция вычисляет хэш дольше. Увеличение стоимости на 1, удвоенное время, необходимое для создания хеша (и, следовательно, удлиняет время, необходимое для разрыва пароля)

 $hash = password_hash($password, PASSWORD_BCRYPT, array("cost" => 10)); 

вы должны установить этот параметр на основе проверки скорости на вашем сервере. Рекомендуется, чтобы функция выполняла 100 мс + (некоторые предпочитают делать 250 мс). Обычно стоимость = 10 или 11 – хороший выбор (в 2015 году).

Чтобы повысить безопасность, вы можете добавить к паролям длинную (50-60 символов – хороший выбор) секретную строку. прежде чем вы будете использовать password_hash () или password_verify ().

 $secret_string = 'asCaahC72D2bywdu@#$@#$234'; $password = trim($_POST['user_password']) . $secret_string; // here use password_* function 

Внимание. Использование параметра PASSWORD_BCRYPT для параметра algo приведет к усечению параметра пароля до максимальной длины 72 символа.

Если пароль $ будет длиннее 72 символов, и вы измените или добавите 73 или 90 символов, хэш не изменится. Необязательно, приклеивание $ secret_string должно быть в конце (после пароля пользователя, а не раньше).