【问题标题】:First row matched but other rows does not match password_verify第一行匹配但其他行不匹配 password_verify
【发布时间】:2015-03-25 16:16:21
【问题描述】:

这是我用盐将哈希密码放在数据库中的注册码。

              <?php
          include '../database/connectDB.php';

            if (isset($_POST['submit']))
{       
                $username= $_POST['leguser'] ;
                $password= $_POST['legpass'] ;  
                $options = [
                    'cost' => 11,
                    'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
                ];
                $pwhash = password_hash($password, PASSWORD_DEFAULT, $options)."\n";

                $username = mysql_real_escape_string($username);
                $password = mysql_real_escape_string($password);

    $query = mysql_query("SELECT * FROM tbl_users WHERE fld_username = '". $username ."'"); 
                    if (mysql_num_rows($query) > 0) 
                    { 
                         echo "<script>alert('Username already used!');</script>"; }
                    else
                    {                           
     mysql_query("INSERT INTO `tbl_users`(fld_username,fld_password) 
     VALUES ('$username','$pwhash')"); 
                    }                          
}

            ?> 

这是我验证密码的登录代码

    <?php 
$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '';
$DB_NAME = 'rsi_db';

$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($conn->connect_errno > 0) {
  die('Connection failed [' . $conn->connect_error . ']');
}


if (isset($_POST['submit']))
    {       
                    $username= $_POST['user'] ;
                    $password= $_POST['pass'] ; 
        $sql = "SELECT * FROM tbl_users WHERE fld_username = '$username'";
        $result = $conn->query($sql);
        if ($result->num_rows === 1) {
        $row = $result->fetch_array(MYSQLI_ASSOC);
        if (password_verify($password, $row['fld_password'])) {
        echo "Match";
        }
        else 
        {
        echo "not match";
        }                 
    }
    }
    ?>

起初我注册了用户名 = 1 和密码 = 1 并尝试登录并匹配,但是当我尝试注册有效的用户和密码时,它不匹配。有人可以帮我进一步解决这个问题吗?

提前谢谢你,我只是一个php初学者,请不要太难:)

【问题讨论】:

  • 在 if password_verify 之前尝试 var_dump($password) 和 var_dump($row['fld_password'])
  • 好吧,这里的输出是:string(1) "1" string(61) "$2y$11$H83GgNapOdRZvmVKYtW5.OwL3P4ju/fBHz/KlMIYCr.1M1hhzJbcO" 不匹配
  • 我现在删除了表的数据并尝试再次注册用户名 = 1 和密码 = 1 但现在它不匹配。 :(
  • UPS。对不起。我的意思是 var_dump($pwhash) 和 var_dump($row['fld_password'])
  • 我假设两个变量的长度都无效。尝试阅读此SO Post

标签: php login passwords


【解决方案1】:

尾随的新行是你的问题:

$pwhash = password_hash($password, PASSWORD_DEFAULT, $options)."\n";
                                                              ______

只需将其从行中删除,它就会将 60 个字符的字符串保存到您的数据库中。您应该删除的另一件事是盐的生成,然后函数本身将为您生成安全的盐。

$options = ['cost' => 11];

【讨论】:

  • 所以我不再需要生成盐了?好的将删除它谢谢! :D
  • @VawnHarveyGalanza - 没有函数password_hash() 会生成自己的盐。您的 22 字节盐(二进制字符串)甚至对 BCrypt 无效,尽管该函数会纠正它。
【解决方案2】:

里面有1个空格

$2y$11$H83GgNapOdRZvmVKYtW5.OwL3P4ju/fBHz/KlMIYCr.1M1hhzJbcO <-here

所以如果你把它限制在 60 以内,那就是中提琴。现在空间消失了

【讨论】:

  • 是的,我编辑了我的代码:$pwhash = password_hash($password, PASSWORD_DEFAULT, $options)."\n";我注意到我放了一个 ".\n" ;所以它在最后一部分有空间。
  • 没有。你必须这样做$pwhash = substr(password_hash($password, PASSWORD_DEFAULT, $options), 0, 60);
猜你喜欢
  • 2014-04-17
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多