РЕШИТЬ
У меня была странная проблема с моей регистрационной формой. 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);
Кажется, проблема в хешировании. Я звонил 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.
Других решений пока нет …