首页 文章

从数据库中检索salt值时,我的哈希密码值不匹配

提问于
浏览
1

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

Register.php

  • 用户输入用户名和密码 .

  • 通过POST收集用户名和密码 .

  • 生成随机盐值将salt值添加到密码值的末尾(由用户输入) . 并散列全部值 .

  • 将用户名,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();

}

的login.php

  • 用户输入用户名和密码 .

  • 通过POST收集用户名和密码 .

  • 检查数据库中是否存在用户名 .

  • 从数据库中获取该用户名的salt值,并将其添加到用户在登录表单中输入的密码的末尾 . 散列此值并将其存储到$ _SESSION [“newHashedValue”]变量中 . (用于测试)

  • 从数据库中检索原始的hashedValue . 将其存储在$ _SESSION [“dbHashedValue”]中并比较值 .

  • 如果值匹配,那么我们知道登录密码是正确的 . 问题:这些值不匹配,因为我输入相同的登录详细信息 .

if(isset($ _ POST [“username”])&& isset($ _ POST [“password”])){$ username = preg_replace('#[^A-Za-z0-9] #i','',$ _POST [ “用户名”]); $ 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;
    }

}

stored in database

1 回答

  • 3
    $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位= 32bytes = 64个字符)

相关问题