从数据库中检索盐值时,我的散列密码值不匹配

my hashed password values are not matching when retrieving salt value from database

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

Register.php

  1. 用户输入用户名和密码。
  2. 通过POST收集用户名和密码。
  3. 生成随机盐值将盐值添加到末尾 密码值(由用户输入)。并哈希完整的值。
  4. Insert username, salt, hashedpassword and original password into 数据库(仅供测试)

    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();
    

    }

login.php

  1. 用户输入用户名和密码。
  2. 通过POST收集用户名和密码。
  3. 检查用户名是否存在于数据库中。
  4. 从数据库中获取该用户名的加盐值,并将其添加到用户在登录表单中输入的密码末尾。散列这个值并将其存储到 $_SESSION["newHashedValue”] 变量中。(用于测试)
  5. 从数据库中检索原始散列值。将其存储在 $_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;
        }
    

    }

$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 个字符)