Проверка пароля хэша 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).

(Если вам интересно, вы можете проверить мой собственный твик, чтобы добавить поддержку более безопасных алгоритмов хеширования паролей в эту библиотеку)

Другие вопросы по тегам