Blowfish加密 - 哈希已创建,但无法验证

时间:2016-03-31 13:11:42

标签: php login blowfish

我刚才写了这段代码,我现在正在为一个新项目复兴,但它似乎不起作用,我不知道为什么它不能验证散列。

当注册第一个passwordEncrypt()函数时,下面运行2个函数。

当尝试登录时,调用checkPassword()函数,而不是登录并回显“是”,它会到达回声“否”的部分。

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

// 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

1 个答案:

答案 0 :(得分:3)

  

“列长度是多少?40?50?60?其他?$ 2a $ 10 $ 023d3086e8462207a1fecueWH4Ub40MWbQJ7F9意味着太短了。 - Fred -iii - ”

  

“数据库中的啊45 - Tom C”

你去吧。该列的长度太短,需要为60。

手册建议255 轻微修正: 255是password_hash()建议使用的手册。但是,最好实际使用255,手册也建议将来记住这一点,并认为它是“一个不错的选择”

您需要清除行,将列更改为60或更高,然后创建新哈希并重新登录。

  

$ 2A $ 10 $ 023d3086e8462207a1fecueWH4Ub40MWbQJ7F9hapWU3lYxlg3AAa

是60长

脚注:

有人说有些人发现很难使用crypt(),而使用password_hash()或兼容包(如果PHP <5.5)https://github.com/ircmaxell/password_compat/实际上更容易。 选择是你的

在堆栈上看到此Q&amp; A也是: