Pertanyaan password_verify tidak memverifikasi hash


Saya hash kata sandi yang dimasukkan melalui password_hash. Saya memverifikasi mereka dengan menggunakan password_verify.

Namun ketika saya memasukkan kata sandi yang di-hash dalam database saya dan saya mencoba untuk memverifikasinya, kedua output selalu berbeda dari masing-masing.

halaman saya adalah sebagai berikut,

main_login.php (form):

<?php include 'header.php';?>
<body>
<form role="form" method="post" action="login.php">
  <div class="form-group">
    <label for="usrname">Username:</label>
    <input type="text" class="form-control" name="usrname" placeholder="Enter username">
  </div>
  <div class="form-group">
    <label for="passwrd">Password:</label>
  </div>
    <input type="password" class="form-control" name="passwrd" placeholder="Enter password">
    <br>
  <input type="checkbox">Remember Me
  <br>
  <br>
  <button type="submit" class="btn btn-default">Submit</button>
</form>
</body>
</html>

login.php (handler):

<?php
include 'vars.php';
include 'header.php';
$sql="SELECT * FROM members WHERE usrname='$usrname'";
$result=mysqli_query($con,$sql);
$count=mysqli_num_rows($result);
$row=mysqli_fetch_row($result);
$verify=password_verify($hash,$row[2]);
if($verify){
    $_SESSION["usrname"]=$usrname;
    echo "Correct";
}
else {
    echo "user: " . $usrname. "<br>";
    echo "pass: " . $hash. "<br>";
    echo "db: " . $row[2]."<br>";
    echo "Wrong Username or Password";
}
?>

vars.php:

<?php
$h='localhost';$u='caelin';$p='****';$d='ombouwnh';
$con=mysqli_connect($h,$u,$p,$d);
$usrname=$_POST['usrname'];
$passwrd=$_POST['passwrd'];
$hash=password_hash($passwrd, PASSWORD_DEFAULT);
?>

ketika saya mencoba login menggunakan username 'caca' dan kata sandi 'caca' saya mendapatkan output yang berbeda untuk keduanya, setiap kali saya coba lagi. Saya tidak dapat menemukan masalah khusus ini pada stackoverflow.

TIA

PS. Jika Anda membutuhkan detail lebih lanjut, tanyakan kepada mereka


6
2017-11-03 19:42


asal


Jawaban:


Fungsi itu password_verify(); mengambil dua parameter; masukan non-hash, dan hash yang tersimpan untuk membandingkannya. Ini hash masukan non-hash secara otomatis untuk dibandingkan dengan versi yang disimpan. Jadi kode awal Anda adalah re-hashing password yang sudah di-hash. Harus terlihat seperti ini:

$verify=password_verify($_POST['passwrd'],$row[2]);

if($verify){
    $_SESSION["usrname"]=$usrname;
    echo "Correct";
}
else {
    echo "user: " . $usrname. "<br>";
    echo "pass: " . $hash. "<br>";
    echo "db: " . $row[2]."<br>";
    echo "Wrong Username or Password";
}

12
2017-11-03 20:02



Anda mengulangi kata sandi - cukup masukkan kata sandi plaintext dan hash Anda (dari db) ke password_verify dan berfungsi.


3
2017-11-03 20:22