Проверка пароля хэша php не работает
У меня странная проблема с хешированными паролями. Я использовал тот же сценарий с другого сайта на другом сервере (Linux работает PHP) на этом сайте (Windows работает PHP). Логин не будет работать, сохраненный хешированный пароль не соответствует введенному паролю, я повторил, чтобы проверить, и они просто не. Насколько я могу судить, код (который одинаков для обоих) работает на Linux, но не на Windows, это возможно?
Вот код (который одинаков на обоих сайтах, поэтому проблем не должно быть)
<?PHP
// get user data
$strUsername = isset($_POST['email']) ? trim(strip_tags($_POST['email'])) : null;
$strPassword = isset($_POST['password']) ? trim(strip_tags($_POST['password'])) : null;
$DBH = new PDO('database details...');
$SQL = "SELECT inj_user_email,inj_user_password,inj_user_password_salt,inj_user_id FROM inj_user WHERE inj_user_email = :username;";
if ( $strUsername == '' || $strPassword = '' )
{
$missing = 'Please enter an email address and password';
}
else
{
$STH = $DBH->prepare($SQL);
$STH->bindParam(':username', $strUsername);
$STH->execute();
$row = $STH->fetch();
if ($STH->rowCount() > 0) {
$verify_password = hash('sha512' , $strPassword.$row['inj_user_password_salt']);
echo $verify_password.'<br>'.$row['inj_user_password'];
if (strcmp($verify_password , $row['inj_user_password']) == 0)
{
session_start();
session_regenerate_id(true);
$_SESSION['user1'] = $row['inj_user_id'];
header('Location: ../screen/');
}
else
{
$missing='Incorrect password';
echo $missing;
exit;
}
}
else
{
$missing ='Email address not found';
}
}
header('Location: ../?missing='.$missing);
?>
Спасибо.
1 ответ
Вам не хватает =
войдите в свое сравнение:
if ( $strUsername == '' || $strPassword = '' )
должно быть
if ( $strUsername == '' || $strPassword == '' )
Также в этой схеме используется соль:
$row['inj_user_password_salt']
Он добавляется к паролю перед хэшированием. Он поступает из базы данных, поэтому прежде всего убедитесь, что соль извлечена правильно и соответствует оригиналу.
Затем проверьте, что используемая вами кодировка символов совпадает с оригинальной, особенно если вы используете символы, отличные от ascii. 2 наиболее популярных кодировки символов, отличных от ascii в PHP, - это UTF-8 (без спецификации) и ISO-8859-1.
В любом случае, вам не следует использовать sha для хэширования (даже 512-битной версии)
Существуют безопасные алгоритмы хеширования паролей, такие как bcrypt.
PHP> = 5.5 реализует функции безопасного хеширования / проверки паролей password_hash и password_verify. Это то, что вы должны использовать.
(Прочтите FAQ по хешированию паролей в руководстве по PHP для получения дополнительной информации)
Существуют также библиотеки хэширования паролей, такие как phpass (используемые популярными CMS, такими как WordPress и Drupal).
(Если вам интересно, вы можете проверить мой собственный твик, чтобы добавить поддержку более безопасных алгоритмов хеширования паролей в эту библиотеку)