Скажем, я хотел сохранить пароль для пользователя, будет ли это правильным способом сделать это с помощью функции 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 должно быть в конце (после пароля пользователя, а не раньше).