我有个问题 . 从数据库中检索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;
}
}
1 回答
将生成一个2048个字符的字符串 . 因此,解决方案是将
salt
列的大小增加到2048,这有点过分,或者生成32个字节,这将是64个字符 .有关此功能的更多信息http://php.net/manual/en/function.openssl-random-pseudo-bytes.php
sha256散列的长度为64,因此
hashedPassword
列的长度应为64.(顾名思义,256位= 32bytes = 64个字符)