Я просто хочу хешировать свой пароль пользователя, принимая регистрацию date_time как соль. Я собираюсь использовать эту функцию:
function create_hash($pass, $created_date, $hash_method = 'md5') {
// the salt will be the reverse of the user's created date
// in seconds since the epoch
$salt = strrev(date('U', strtotime($created_date));
if (function_exists('hash') && in_array($hash_method, hash_algos()) {
return hash($hash_method, $salt.$pass);
}
return md5($salt.$pass);
}
А также аналогичный метод для проверки пароля. Но я думаю о процессе регистрации. В моей регистрационной форме у меня есть только поле имени пользователя и пароля, и в моей базе данных MySQL дата создания будет добавлена автоматически.
Но когда я регистрируюсь в первый раз, мне также нужно создать create_date для хеширования пароля? Как это побороть? Так что в основном я представляю, что мне нужно получить creation_date, прежде чем вставлять данные в базу данных для засолки. Как это сделать?
Один из подходов, о котором я думаю, в моей регистрационной форме перед вызовом этой функции я сделаю это:
$created_date = date("Y-m-d H:i:s");
$salt = strrev(date('U', strtotime($created_date));
Но я боюсь, будет ли разница во времени между этим временем соли и временем создания базы данных. Если так, то моя password_validation не будет работать ..
*** Кстати, я знаю, md5 () не является защищенным. Так что мне не нужно предложение о MD5 или другой алгоритм хеширования. Меня просто интересует соление
Мейби — лучшая идея написать функцию, которая создает соль
function salt($n=3)
{
$key = '';
$pattern = '1234567890abcdefghijklmnopqrstuvwxyz.,*_-=+#@!&^%';
$counter = strlen($pattern)-1;
for($i=0; $i<$n; $i++)
{
$key .= $pattern{rand(0,$counter)};
}
return $key;
}
и когда новый пользователь зарегистрирован, чтобы вызвать эту функцию и сделать что-то вроде этого:
$salt=salt();
$hash_pass=md5(md5($_POST['password']).$salt);
mysql_query("INSERT INTO `my_table` SET `name`='".$_POST["name"]."', `pass`='".$hash_pass."' `regDate`=NOW() ");
Когда пользователь вошел в систему, вы выбираете данные пользователя из таблицы в качестве имени и сравниваете его хешированный пароль с опубликованным паролем с его солью.
Лучшая соль, которую вы можете получить, не зависит от каких-либо других параметров и не предсказуема. На детерминированном компьютере лучшее, что вы можете сделать, это получить соль из случайного источника операционной системы. Этот случайный источник будет собирать реальные шансы от таких событий, как действия пользователя, время загрузки и многое другое …
PHP уже имеет специальную функцию password_hash () генерировать безопасный хеш BCrypt с такой случайной солью. Он включает соль в результирующее хеш-значение, поэтому вы можете сохранить ее в одном поле в базе данных.
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);
// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);
Использование перца также может быть хорошей идеей, но есть и лучшие способы добавить такой секрет на стороне сервера. Независимо от того, содержит ли ваш перец специальные символы или просто длиннее, энтропия важна. Если вы заинтересованы, вы можете взглянуть на мой учебник о надежное хранение пароля, на последних страницах я пытался объяснить плюсы и минусы перца.