【问题标题】:my hashed password values are not matching when retrieving salt value from database从数据库中检索盐值时,我的哈希密码值不匹配
【发布时间】:2016-02-26 16:15:33
【问题描述】:

我有问题。从数据库中检索盐值时,我的哈希密码值不匹配。

注册.php

  1. 用户输入用户名和密码。
  2. 通过 POST 收集用户名和密码。
  3. 生成随机盐值将盐值添加到末尾 密码值(由用户输入)。并散列全部价值。
  4. 将用户名、salt、hashedpassword 和原始密码插入 数据库(仅用于测试)

    if (isset($_POST["usernameReg"]) && isset($_POST["passwordReg"])){
     // filter everything but numbers and letters
    $username = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["usernameReg"]); 
    $password = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["passwordReg"]); 
    
    $salt = openssl_random_pseudo_bytes(1024);
    
    $hashedPassword = hash('sha256', $password.$salt);
    //$hashedPassword1 = hash('sha256', $password);
    
    $query = "INSERT INTO users (username, salt, hashedPassword, password) VALUES (:username, :salt, :hashedPassword, :password)";
    
    $statement = $pdoConnection->prepare($query);
    $statement->bindValue(':username', $username, PDO::PARAM_STR);
    $statement->bindValue(':salt', $salt, PDO::PARAM_STR);
    $statement->bindValue(':hashedPassword', $hashedPassword, PDO::PARAM_STR);
    $statement->bindValue(':password', $password, PDO::PARAM_STR);
    $statement->execute();
    

    }

登录.php

  1. 用户输入用户名和密码。
  2. 通过 POST 收集用户名和密码。
  3. 检查用户名是否存在于数据库中。
  4. 从数据库中获取该用户名的盐值并将其添加到用户在登录表单中输入的密码的末尾。散列这个值并将其存储到 $_SESSION["newHashedValue"] 变量中。(用于测试)
  5. 从数据库中检索原始的 hashedValue。将其存储在 $_SESSION[" dbHashedValue"] 中并比较值。
  6. 如果值匹配,那么我们知道登录密码是正确的。 问题:这些值不匹配,它们应该是因为我输入了相同的登录详细信息。

    if (isset($_POST["username"]) && isset($_POST["password"])){ $username = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["username"]); $password = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["password"]);

        //check if this username and password exist in our database and are therefore valid
        $query = "SELECT * FROM users WHERE username=:username LIMIT 1";
    
        $statement = $pdoConnection->prepare($query);
        $statement->bindValue(':username', $username, PDO::PARAM_STR);
        $statement->execute();
        $statement->setFetchMode(PDO::FETCH_ASSOC);
    
        while($row = $statement->fetch()){
            $saltPassword = $password.$row["salt"];
            $newHashedValue = hash('sha256', $saltPassword);
            $dbHashedValue = $row["hashedPassword"];
            //these two values are not matching but they should match
            $_SESSION["newHashedValue"] = $newHashedValue;
            $_SESSION["dbHashedValue"] = $dbHashedValue;
        }
    

    }

【问题讨论】:

  • 这应该是不可能的。请检查hashedPasswordsalt 列是否足够长以存储您的信息?也许你的盐或哈希在某一时刻被切断了,这会毁掉一切。请记住salt 的长度应为 2048 而不是 1024。
  • 您的数据库列是如何设置的?是否有足够的空间来存储完整的哈希?
  • 只需使用password_hashpassword_verify
  • @Sarah 是的,但是 PHP 5.4 已经报废了。不过有一些针对过时 PHP 版本的 polyfill,这里有一个:github.com/ircmaxell/password_compat
  • @Sarah PHP 5.4 目前没有收到安全更新,我不知道目前是否有任何未修补漏洞,但我一般不建议使用过时的 PHP 版本。至于哪个更安全,请参阅SHA512 vs. Blowfish and Bcrypt [closed]password_hash 目前使用 Bcrypt,成本为 10)。

标签: php database hash login salt


【解决方案1】:
$salt = openssl_random_pseudo_bytes(1024); //will generate 2048 chars since a character is half a byte.

将生成一个 2048 个字符的字符串。因此,解决方案是将salt 列的大小增加到 2048,这有点矫枉过正,或者生成 32 个字节,即 64 个字符。

$salt = openssl_random_pseudo_bytes(32); //will generate 64 chars

更多关于函数的信息在这里http://php.net/manual/en/function.openssl-random-pseudo-bytes.php

sha256 哈希的长度为 64,因此hashedPassword 列的长度应为 64。(顾名思义,256 位 = 32 字节 = 64 个字符)

【讨论】:

    猜你喜欢
    • 2012-07-11
    • 2012-07-05
    • 1970-01-01
    • 2016-10-05
    • 2012-11-04
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多