PHP:在MySQL中用字符串替换'dollar'

时间:2013-09-24 18:44:42

标签: php mysql hash passwords

我有一个严重的问题,整天我一直在寻找答案,但我找不到任何东西......

我在做什么:

我正在尝试让用户在我的网站上登录(在php中)。

密码和用户保存在我服务器上的MySQL数据库中。

对于我使用的密码 Bcrypt 。唯一的问题是我没有更改 Bcrypt 代码的知识。我从一个免费的网站获得了这个类。

问题

现在针对这个问题,当我对我的密码进行哈希处理时,前面有三个$个符号。

例如:loltest将成为$2y$10$wxadWEbkn..XpJ.C1TmnaeOyneJyQbcAIJ20yBBlBoBr1XDwDkJSq

散列密码存储在我的数据库的表中。

第1步

用户登录他/她的密码,然后php代码验证密码是否与哈希密码匹配。用户名为$phpro_username,密码存储在$phpro_password

但是在我调用该函数之前,我正在从我的表中选择哈希密码,如下所示:

 $dbh = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username,      $mysql_password);    
 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 $stmt = $dbh->prepare("SELECT phpro_password FROM phpro_users WHERE phpro_username = '$phpro_username'");
 $stmt->execute();
 $hash = $stmt->fetchColumn();

第2步

我尝试使用名为password_verify的函数,它看起来像这样:

function password_verify($password, $hash) {
    if (!function_exists('crypt')) {
        trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING);
        return false;
    }
    $ret = crypt($password, $hash);
    if (!is_string($ret) || strlen($ret) != strlen($hash) || strlen($ret) <= 13) {
        return false;
    }

    $status = 0;
    for ($i = 0; $i < strlen($ret); $i++) {
        $status |= (ord($ret[$i]) ^ ord($hash[$i]));
    }

    return $status === 0;
}

我该怎么做?

$check = password_verify($phpro_password, $hash);

如果密码匹配$check将为1,否则它将为空。

通常这应该有效,但是当我运行此代码时,$check始终为空。如果我尝试在没有MySQL的情况下这样做,那就没有问题:

<?php
   include 'password.php';
   $password = "loltest";
   $hash = password_hash($password, PASSWORD_BCRYPT);
   $verify = password_verify("loltest", $hash);
   echo $verify;
?>

例如,如果我运行上面的代码,$verify始终为1。

经过一些研究后发现:

我认为问题在于MySQL,因为在我的哈希值中有三个$符号,如果我将它存储在MySQL中然后将其删除,则变量会随着它们的值而改变,在这种情况下没有任何内容和密码不匹配。

有没有办法解决这个问题?或者有没有办法替换哈希中的$符号?

1 个答案:

答案 0 :(得分:4)

单引号字符串不会被处理,而是“按原样”处理。除非特别需要$变量,否则应始终使用单引号字符串。

例如,

$var = "$2y$10$wxadWEbkn..XpJ.C1TmnaeOyneJyQbcAIJ20yBBlBoBr1XDwDkJSq";

应该是

$var = '$2y$10$wxadWEbkn..XpJ.C1TmnaeOyneJyQbcAIJ20yBBlBoBr1XDwDkJSq';