У меня возникла проблема с получением пароля, хранящегося в mysql, чтобы он совпадал с паролем для входа в систему с использованием соли.
Вот код из моего создания пароля:
$hash = hash('sha256', $password);
function createSalt()
{
$text = md5(uniqid(rand(), true));
return substr($text, 0, 3);
}
$salt = createSalt();
$password = hash('sha256', $salt . $hash);
Вот код на моей странице входа в систему:
$userData = $result->fetch_array(MYSQL_ASSOC);
$hash = hash('sha256', $password);
$password = hash('sha256', $userData['salt'] . $hash);
//$hash = hash('sha256', $userData['salt'] . hash('sha256', $password) );
if($password != $userData['Password']) // Incorrect password. So, redirect to login_form again.
Нет ошибок при создании пароля в mysql (поле заполнено i.e 0d02a88c1e1057a64df6b3fed4c6ad64e228313b803e9f9b36 …
В то время как Логин создает что-то вроде: 51839f9a15dac1f26825f4cd5d2ecf7ae83ea88d440415b04fb6ae41c3a0566f
Просто не уверен, где проблема. Заранее спасибо, я очень новичок в PHP.
Во-первых, здесь у вас есть некоторая путаница с именами переменных — вы используете $ password для представления как открытого текста, так и представления с зашифрованным знаком. Это затрудняет чтение вашего кода.
Во-вторых, давайте посмотрим на ваш код как на последовательность состояний, чтобы выяснить, где они могут пойти не так:
Сделайте вашу жизнь проще и сохраните ваши пароли с помощью функции password_hash ().
Алгоритмы SHA- * не подходят для хеширования паролей, потому что они слишком быстры. Функция 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);