【发布时间】:2023-03-22 09:56:01
【问题描述】:
我浏览了许多与此主题相关的文章,例如:
Using PHP 5.5's password_hash and password_verify function
然而,我不确定我是否以正确的方式散列和加盐!
我想用我自己的盐然后散列。 salt 和 hashed 密码都存储在数据库中的两个不同字段中。
这是我在存储到数据库之前对密码进行哈希处理的方式
$cost = 10;
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
$salt = sprintf("$2a$%02d$", $cost) . $salt;
//shall I remove this line and replace below PASSWORD_DEFAULT with PASSWORD_BCRYPT instead?
$password = crypt($data['password'], $salt);
$hash = password_hash($password, PASSWORD_DEFAULT);
鉴于此,我正在尝试验证密码如下:不知何故,我觉得我使过程复杂化。
$salt=$row['salt'];//taken from db
$hashAndSalt=$row['hashpword'];//taken from db
$password="pwtester";//user keyed in password
$newpassword = crypt($password, $salt);
$newhash = password_hash($newpassword, PASSWORD_DEFAULT);
if (password_verify($password, $newhash)) {
echo"verified";
}
else
{
echo"Not verified";
}
已编辑:
现在我这样存储:
$cost = 10;
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
$options = array('cost' => $cost,'salt' => $salt);
$hash = password_hash($data['password'], PASSWORD_DEFAULT,$options);
但验证令人困惑:
$email = "test55@gmail.com";
$uid= '555ca83664caf';
$sql = "SELECT *FROM authsessions WHERE email =:myemail AND useruuid =:uid";
$statement = $pdo->prepare($sql);
$statement->bindValue(':myemail', $email);
$statement->bindValue(':uid', $uid);
$statement->execute();
while( $row = $statement->fetch()) {
echo "salt ".$row['salt']."<br/><br/>";
echo "hashpassword ".$row['hashpword'];
}
$salt=$row['salt'];
$hashAndSalt=$row['hashpword'];
$password="test55";
$newhash = password_hash($password+$salt, PASSWORD_DEFAULT);
if (password_verify($newhash, $hashAndSalt)) {
echo"verified";
}
else
{
echo"Not verified";
}
它与“未验证”相呼应
【问题讨论】:
-
@user3633383,什么值?嗯,我得到了盐字符串和散列密码,但是当我验证时它说未验证
-
好吧,我以前没用过这些功能。似乎正在发生的事情是您正在对密码进行哈希处理,然后使用它来验证它是否是有效密码。
password_verify()采用未散列的原始密码。