hash — проблема с проверкой пароля PHP / MYSQLi с использованием соли

У меня возникла проблема с получением пароля, хранящегося в 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.

-1

Решение

Во-первых, здесь у вас есть некоторая путаница с именами переменных — вы используете $ password для представления как открытого текста, так и представления с зашифрованным знаком. Это затрудняет чтение вашего кода.

Во-вторых, давайте посмотрим на ваш код как на последовательность состояний, чтобы выяснить, где они могут пойти не так:

  1. Ввод пароля. В обоих случаях передается одна и та же строка? Вы обратили внимание на пробелы и заглавные буквы? Используйте отладчик для проверки. Если открытый текстовый пароль не является байтовым идентичным, начальный хэш sha256 должен показать различия в этой точке.
  2. Соль генерация / поиск. Вы сохранили / получили ту же самую соль, побайтно? Опять же, следите за пробелами / заглавными буквами, а также убедитесь, что ваша база данных не усекает и не изменяет кодировку строки.
  3. Сравните строки после их объединения, но до второй операции хеширования sha256. По определению, поскольку окончательный вывод отличается, либо ваш пароль в виде открытого текста, либо соль не идентичны побайтно. Это поможет вам определить, является ли один или оба виновными.
0

Другие решения

Сделайте вашу жизнь проще и сохраните ваши пароли с помощью функции 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);
0

По вопросам рекламы [email protected]