Php Blowfish加密-已创建哈希,但不会验证

Php Blowfish加密-已创建哈希,但不会验证,php,login,blowfish,Php,Login,Blowfish,我不久前写了这段代码,现在我正在为一个新项目重新编写它,但它似乎不起作用,而且我一辈子都不明白为什么它不能验证散列 下面是注册调用第一个passwordEncrypt()函数时运行的两个函数 当尝试登录时,将调用checkPassword()函数,而不是登录并回显“yes”,它将进入回显“no”的部分 所以,如果有一双新的眼睛可以看一看,请提前多谢 // Encrypt user password function passwordEncrypt($password) { // set

我不久前写了这段代码,现在我正在为一个新项目重新编写它,但它似乎不起作用,而且我一辈子都不明白为什么它不能验证散列

下面是注册调用第一个passwordEncrypt()函数时运行的两个函数

当尝试登录时,将调用checkPassword()函数,而不是登录并回显“yes”,它将进入回显“no”的部分

所以,如果有一双新的眼睛可以看一看,请提前多谢

// Encrypt user password
function passwordEncrypt($password) {
    // set the salt
    $salt = substr(md5(time()), 0, 22);

    // encrypt using blowfish with a load of 10
    $password = crypt($password, '$2a$10$' . $salt);

    // return the encrypted hash
    return $password;
}

/*
    Check password function when logging in
    first we select the password from the supplied username from the database
    // get the row and set the hash to the currect password from the database
    //run the salts etc and check to see if the passwords match
*/
function checkPassword($userName, $password, $db){
    $sql = 'SELECT password FROM users WHERE userName = :userName';
    $stmt = $db->prepare($sql);
    $stmt->bindValue(':userName', $userName, PDO::PARAM_STR);
    $stmt->execute();

    $numRows = $stmt->rowCount();

    if ($numRows > 0) {
        $row = $stmt->fetch();
        $hash = $row['password'];

        // run the hash function on $password 
        $fullSalt = substr($hash, 0, 29); 
        $new_hash = crypt($password, $fullSalt); 

        // Check that the password matches
        if($hash == $new_hash) {
            echo 'yes';
            exit;
            return true;
        } else {
            echo 'no';
            exit;
            return false;
        }
    } else {
        echo 'way';
        exit;
        return false;
    }
}
我已经注册了一个密码,然后尝试了它,这是它返回的结果

密码:$2a$10$023d3086e8462207a1fecueWH4Ub40MWbQJ7F9 输入:$2a$10$023d3086e8462207a1fecueWH4Ub40MWbQJ7F9hapWU3lYxlg3AAa 没有

因此,它增加了hapWU3lYxlg3AAa

“列长度是多少?40?50?60?其他?$2a$10$023D3086E8462207A1FECUE4UB40MWBQJ7F9意味着太短。”-弗雷德-ii-

“数据库中的ah 45–Tom C”

好了。列的长度太短,需要为60

手册建议使用255。
轻微更正:手册建议使用255。然而,最好实际使用255,因为手册还建议在将来记住它,并认为它是“一个不错的选择”

您需要清除行,将列更改为60或更大,然后创建新的哈希并再次登录

$2a$10$023d3086e8462207a1fecueWH4Ub40MWbQJ7F9hapWU3lYxlg3AAa

是60长吗


脚注:

据说有些人发现很难使用
crypt()
,而使用
password\u hash()
或兼容包(如果PHP<5.5)实际上更容易。选择权在你

另请参见本问答:


密码列的长度和哈希字符串的长度是多少?顺便说一句,您的退出将取消您的返回。如果您知道如何ping某人,很好。你的问题没有资格得到神奇的答案。你真的不应该在密码哈希上使用你自己的盐,你真的应该使用PHP来处理密码安全性。如果您使用的是低于5.5的PHP版本,您可以使用
密码\u hash()
。它可以为您执行随机加密,并且需要的代码更少。奇妙的伴侣,谢谢您,它所需要的只是一双新鲜的眼睛。重建数据库时没有考虑字段长度。谢谢again@TomC不客气,汤姆。我一看到你的密码,看起来很合法,我的蜘蛛感觉就在专栏的长度上刺痛。Cheeshaha检查列长度已经直接进入我未来的检查清单,你的蜘蛛感觉是对的@一个人必须始终倾听他们的小声音;-)顺便说一句,如果你想重新加载,我已经对我的答案进行了编辑。我添加了一些您可能会感兴趣的附加信息。干杯汉克·弗雷德:)如果我能投更多的票,我将不胜感激