Bcrypt无法正确验证的问题

时间:2013-04-26 22:21:02

标签: php validation pdo cryptography authorization

我正在使用ircmaxell编写的名为password_compat的脚本。我以为我正确地遵循了他的说明,但我似乎无法使用password_verify($password, $hash)验证我的密码。

我的数据库中保存的散列密码是;

$2y$10$zYpSzIj7kTPv3H7wDI/uXSYqi1se46b38uumP6SM4XGMmsjU3q

我正在使用PDO获取我的哈希密码并使用password_verify($password, $hash)来比较登录表单的发布内容。我的理解是,BRCYPT不是一个散列函数,所以password_verify($password, $hash)会做出它的魔力。我不知道如何创建盐,但我认为它会为每个新密码创建一个自定义盐,但它如何将它与我保存的密码进行比较让我感到困惑。它如何与密码匹配正确的盐?这整个不保存我的数据库中的盐有点困惑我,哈哈。这是我正在使用的代码;

bcrypt

if($login->verifyip($_SERVER['REMOTE_ADDR']))
{
    require_once 'password.php'; //password_compat supplied file

    $username   = $_POST['username'];
    $password   = $_POST['password'];
    $dbpassword = $login->GetPassword($username); // pull saved password from db

    // verify posted password with saved password
    if(password_verify($dbpassword, $password))
    {
        echo 'verified';
    }
    else
    {
        echo 'not verified';
    }
}

PDO

public function GetPassword($username)
{
    $passwordSQL = 'CALL get_password(:_user)'; // using stored procedure
    try
    {
        $pdo = new PDO('my login stuff');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $password = $pdo->prepare($passwordSQL);
        $password->bindParam(':_user',$username);
        $password->execute();
        $fetch = $password->fetchColumn(0);
        $password->closeCursor();
        return $fetch;
    }
    catch(PDOException $e)
    {
         return 'error' . $e->getMessage();
         exit();
    }        
}

我删除了像blender建议的$ hash。

感谢您一看:)

1 个答案:

答案 0 :(得分:2)

password_verify的论点是另一种方式:

password_verify($password, $dbpassword)

至于它是如何工作的,哈希就是这种形式:

$<algorithm>$<cost>$<salt>/<hash>

所以从哈希:

$2y$10$zYpSzIj7kTPv3H7wDI/uXSYqi1se46b38uumP6SM4XGMmsjU3q

您可以看到费用为10,盐为zYpSzIj7kTPv3H7wDIbcrypt(salt + password)uXSYqi1se46b38uumP6SM4XGMmsjU3q

password_verify从您提供的哈希中提取该信息,只检查bcrypt(salt + password) == hash