password_verify不返回任何内容

时间:2018-07-31 05:51:40

标签: php passwords password-encryption password-hash

当我运行下面的代码时,password_verify不返回任何内容。我试着回声,看看又回来了,什么也没打印。

我也回应了存储的pw,以确保这不是问题,不是问题。我回应了用户的输入,这似乎也很好。

我使用的密码之一是Grayson,哈希值为$ 2y $ 10 $ iK5pADTskgcfo6KRnBXs3e / 0LkclrsZb3DSo1bmLubLqd.aaIdnK2

<?php
    $loginEmail = $_POST['loginEmail'];
    $loginPassword = $_POST['loginPassword'];
    $link = mysqli_connect("localhost", "cjramire_wrdp1", 'password', "username");
    $query = "SELECT * FROM `Users` WHERE email = '".mysqli_real_escape_string($link, $loginEmail)."'";
    $result = mysqli_query($link, $query);
    $row = mysqli_fetch_array($result);
    echo $row['password'];
    echo $loginPassword;
    $verify = password_verify($loginPassword, $row['password']);
    echo $verify;
    if($verify){
        echo "Its a match";
    }else{
        echo "nope";
    }

让我知道是否还有其他信息对您有帮助,谢谢!

下面,我添加了用于将信息推送到数据库中的代码,因为您可以看到pws在被推送到数据库之前已被散列。

$signUpEmail =  $_POST['signUpEmail'];
$signUpPassword = $POST['signUpPassword'];
$hash = password_hash($signUpPassword,PASSWORD_DEFAULT);
$link = mysqli_connect("localhost", "cjramire_wrdp1", 'password', "username");
$query = "INSERT INTO `Users` (`email`, `password`) VALUES('$signUpEmail', '$hash')";
mysqli_query($link, $query);

3 个答案:

答案 0 :(得分:2)

根据php.net,password_verify()的第二个参数必须为

  

由password_hash()创建的哈希。

取自php.net

您的第二个参数似乎是SQL查询的结果,因此,如果您不将密码存储为password_hash()创建的哈希,password_verify()将无法正常工作

答案 1 :(得分:1)

这个问题是1年6个月大,但我遇到了同样的问题。经过一番努力,我找到了解决方案,因此想在这里分享。

问题在于MySQL表列中接受密码的值的长度。我将列类型varchar设置为存储密码,并且此列的值长度设置为50个字符。我将密码列的长度更改为200个字符,这解决了我的问题。看起来MySQL无论如何都接受varchar中的输入,但仅首先接受设置为列长的许多字符,这成为完整生成的散列的原因未存储在数据库中。

我希望这可以帮助任何再次遇到此问题的人。

答案 2 :(得分:0)

因此,我将密码“ myPassword”与password_hash()一起使用以生成哈希值,以模拟存储在数据库中的哈希值。我生成的哈希是:

$signUpPassword = 'myPassword';
$hash = password_hash($signUpPassword,PASSWORD_DEFAULT);

我生成的哈希是:

'$2y$10$/oQgn.v5Nb3WB1Nf3LK0B.ZAjynRICezFez936e5Kl5vd3KMwO9oa'

您的哈希应该与上面的哈希相似。

然后我跑了

//Simulated db hash.
$dbHash = '$2y$10$/oQgn.v5Nb3WB1Nf3LK0B.ZAjynRICezFez936e5Kl5vd3KMwO9oa';


$loginPassword = 'myPassword';
$verify = password_verify($loginPassword, $dbHash);

if($verify){

  echo "Its a match";

}else{

  echo "nope";

  }  

结果是“匹配”。

我真的看不到为什么您的代码无法正常工作,但是这是我无法解决的原因。

  • 确保您的密码列至少为255个字符。我想我读过PASSWORD_DEFAULT的哈希值始终为60个字符,但将来可能会改变,因此,为了防止将来出现问题,请使列大小为255个字符。
  • 确保将数据库中的password列类型设置为varChar,而不是二进制数据类型。

  • 在生成要插入数据库中的哈希时,请确保生成的哈希与插入数据库中的哈希匹配。这个想法可能是您的代码或数据库正在向您的哈希添加斜杠。

  • 确保您使用相同的密码进行测试。

  • 在将代码输入pasword_hash()password_verify()函数之前,请确保代码未转义用户输入或数据。

  • 您正在使用电子邮件地址查询数据库以提取用户记录。确保您没有多个相同的电子邮件地址。服务器可能正在向您提供错误的用户哈希。

  • 确保查询返回正确的数据。

希望有帮助。