从数据库中检索盐值时,我的散列密码值不匹配
my hashed password values are not matching when retrieving salt value from database
我有问题。从数据库中检索盐值时,我的散列密码值不匹配。
Register.php
- 用户输入用户名和密码。
- 通过POST收集用户名和密码。
- 生成随机盐值将盐值添加到末尾
密码值(由用户输入)。并哈希完整的值。
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
- 用户输入用户名和密码。
- 通过POST收集用户名和密码。
- 检查用户名是否存在于数据库中。
- 从数据库中获取该用户名的加盐值,并将其添加到用户在登录表单中输入的密码末尾。散列这个值并将其存储到 $_SESSION["newHashedValue”] 变量中。(用于测试)
- 从数据库中检索原始散列值。将其存储在 $_SESSION[" dbHashedValue”] 中并比较值。
如果值匹配,则我们知道登录密码是正确的。
问题:这些值不匹配,但它们应该匹配,因为我输入了相同的登录详细信息。
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 个字符)
我有问题。从数据库中检索盐值时,我的散列密码值不匹配。
Register.php
- 用户输入用户名和密码。
- 通过POST收集用户名和密码。
- 生成随机盐值将盐值添加到末尾 密码值(由用户输入)。并哈希完整的值。
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
- 用户输入用户名和密码。
- 通过POST收集用户名和密码。
- 检查用户名是否存在于数据库中。
- 从数据库中获取该用户名的加盐值,并将其添加到用户在登录表单中输入的密码末尾。散列这个值并将其存储到 $_SESSION["newHashedValue”] 变量中。(用于测试)
- 从数据库中检索原始散列值。将其存储在 $_SESSION[" dbHashedValue”] 中并比较值。
如果值匹配,则我们知道登录密码是正确的。 问题:这些值不匹配,但它们应该匹配,因为我输入了相同的登录详细信息。
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 个字符)