为什么不发生这种哈希的匹配?

时间:2016-03-18 02:34:20

标签: php sql hash passwords

我正在使用 PHP版本5.4 ,我现在已经浏览了一段时间来进行散列机制,但我无法让它工作。棘手的部分是用另一个用户尝试来验证散列密码,我在这里做错了什么?

  //and yes I am using password as name in this example

 $password_entered ="cucumberball";
    $password_hash = crypt($password_entered);

mysql_set_charset('utf8');
pdoConnect();

//insert hashed pass (same name and pass(hashed) for user)
$stmt = $pdo->prepare("insert into user (name,password) values (:name,:password)");
    $stmt->bindParam(':name', $password_entered);
    $stmt->bindParam(':password', $password_hash);
    $stmt->execute();

    //retriving password from db and checking if its correct with the login password provided
    $stmt = $pdo->prepare("select password from user where name = :name LIMIT 1;");
    $stmt->bindParam(':name', $password_entered);
    $stmt->execute();

    $user = $stmt->fetch(PDO::FETCH_OBJ);

     if(crypt($password_entered, $password_hash) == $user->password) {
        // password is correct
        echo "WORKS";
    }else{

        echo "did not work";
    }

2 个答案:

答案 0 :(得分:1)

当您进行比较时,您在加密密码时正在腌制,而且数据库中的密码仅被加密。

if(crypt($password_entered, $password_hash) == $user->password) {

另外,根据文档,你应该像这样比较

  

你应该将crypt()的整个结果作为salt传递给   比较密码,以避免在不同的散列时出现问题   使用算法。 (如上所述,标准的基于DES的密码   散列使​​用2个字符的盐,但基于MD5的散列使用12。)

if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) {
   echo "Password verified!";

答案 1 :(得分:0)

修复此if语句:

if(hash_equals(crypt($password_entered, $password_hash), $password_hash))
{
    echo "WORKS";
}

或者因为PHP 5.4中没有hash_equals

if(crypt($password_entered, $password_hash) == $password_hash)
{
    echo "WORKS";
}

但如果没有hash_equals,您的哈希很容易受到timing attack的攻击。<​​/ p>

您也可以阅读this manual