password_verify не работает при использовании хешированного пароля из базы данных

РЕШИТЬ

У меня была странная проблема с моей регистрационной формой. JS делал что-то странное, и хотя password_verify работал при входе в систему, хеш-код в некоторых случаях был другим … Теперь я исправил свой код, и теперь он работает! Спасибо всем ребята!

РЕШИТЬ

Я серьезно пытаюсь выяснить, почему мой код password_verify не работает уже 4 дня, и я становлюсь действительно растерянным и злым …

Прежде всего я должен сказать, что сессия уже запущена, а все остальное работает без проблем.

Но когда я пытаюсь создать скрипт password_verify, он все равно повторяет ложное …

поле в базе данных называется password и установлен в varchar 255,

Пароль из базы данных выглядит так:

$ 2y $ 10 $ GEw0Ie6r / Udz2hgJVkCy.ut99NY5NE.h8LEvNM1gBizA1tY58iNa6

Это хорошо, вот как это должно выглядеть …

И когда я повторяю пароль базы данных на моей странице, он показывает то же самое, так что это хорошо. Но, когда я делаю password_verify, это не работает. Это показывает, что password_verify ложь … и я не знаю почему, потому что я на 100% уверен, что пароль, который я ввожу в форму, правильный и совпадает с паролем БД. Тем не менее, он не работает, и он не повторяет «СДЕЛАНО», как следует.

echo strlen показывает 60

echo $dbpassword показывает хешированный пароль базы данных.

echo $passwordsubmitted показывает обычный введенный пароль из формы.

<?php
if(isset($_POST['changepassword'])){
if($_POST['username'] !== $_SESSION['username']){
echo "Invalid username";
}
else{
$stmtselectvalues = $mysqli->prepare("SELECT password FROM members WHERE username = ?");
$stmtselectvalues->bind_param('s',$_SESSION['username']);
$stmtselectvalues->execute();
$stmtselectvalues->bind_result($dbpassword);
$stmtselectvalues->store_result();
while($stmtselectvalues->fetch()){
$passwordsubmitted = $_POST['password'];
echo strlen($dbpassword)."<p>";

echo "Submitted password: ".$passwordsubmitted." and password from database: ".$dbpassword."<p>";
if(password_verify($passwordsubmitted, $dbpassword) == false){
echo "Invalid Password";
}
else{
echo "DONE!";
}
}
}
}
?>
<center>
<form method='POST'>
Username: <input type='text' name='username'><br>
Password: <input type='text' name='password'><br>
<input type='submit' name='changepassword'><br>
</form>

Но когда я использую этот код, он работает, и echo «DONE», что означает, что password_verify имеет значение true …

<?php
if(isset($_POST['changepassword'])){
if($_POST['username'] !== $_SESSION['username']){
echo "Invalid username";
}
else{
$dbpassword = password_hash("test", PASSWORD_BCRYPT);
$passwordsubmitted = $_POST['password'];
echo strlen($dbpassword)."<p>";

echo "Submitted password: ".$passwordsubmitted." and password from database: ".$dbpassword."<p>";
if(password_verify($passwordsubmitted, $dbpassword) == false){
echo "Invalid Password";
}
else{
echo "DONE!";
}
}
}
?>
<center>
<form method='POST'>
Username: <input type='text' name='username'><br>
Password: <input type='text' name='password'><br>
<input type='submit' name='changepassword'><br>
</form>

Я действительно не знаю, почему это происходит. Какие-либо предложения?

ОБНОВИТЬ
Вход для регистрации <input type='password' name='password'>

и представленный пароль от регистрации хешируется с этим кодом:

$password = $_POST['password'];
$passwordhash = password_hash($password, PASSWORD_BCRYPT);

1

Решение

Кажется, проблема в хешировании. Я звонил bcrypt() с одним и тем же строковым параметром семь раз, и он вернул семь разных значений хеша, только первые семь символов всегда равны $ 2y $ 10 $:

$2y$10$C7FReGma/9fauYdufdNR3uleGKBgcl4vzL/tMjsksKOmNoPpcoaT2
$2y$10$f7ZjFAgyq5tNcG7dc8RsIuOPTPLFyJFK0RiWfPusE7gqs4.hpRH.u
$2y$10$PnQrq.C3NOdxyNwpWZowzOe77Dsc0Qdr5yzrMzHAV3rH7aqVZYslG
$2y$10$6LL9imr9qB3mnJaoDFsurOAqas4Co/6bN.6mgheHzSboLDtT.Q5hS
$2y$10$Rytiq/6HILN3Bm6cLT7ZM.rO.LjxuLY2xM2FZs3Pa9O2BXbH5H3vO
$2y$10$gg21TJ6GiJg6Wz7RVQkyfufHzlAzfTkKfOdOgsRKotKpsgAoFQErK
$2y$10$v8YdEIA25mBIi4jsrCDABuFzmITv.BuMr9YQl2RUN2xc1rmk0Po9a

Та же проблема с MD5 (). Так когда password_verify() сравнивает два
хэши возвращает false.

-2

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

Других решений пока нет …

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