我正在使用 PHP版本5.4 ,我现在已经浏览了一段时间来进行散列机制,但我无法让它工作。棘手的部分是用另一个用户尝试来验证散列密码,我在这里做错了什么?
//and yes I am using password as name in this example
$password_entered ="cucumberball";
$password_hash = crypt($password_entered);
mysql_set_charset('utf8');
pdoConnect();
//insert hashed pass (same name and pass(hashed) for user)
$stmt = $pdo->prepare("insert into user (name,password) values (:name,:password)");
$stmt->bindParam(':name', $password_entered);
$stmt->bindParam(':password', $password_hash);
$stmt->execute();
//retriving password from db and checking if its correct with the login password provided
$stmt = $pdo->prepare("select password from user where name = :name LIMIT 1;");
$stmt->bindParam(':name', $password_entered);
$stmt->execute();
$user = $stmt->fetch(PDO::FETCH_OBJ);
if(crypt($password_entered, $password_hash) == $user->password) {
// password is correct
echo "WORKS";
}else{
echo "did not work";
}
答案 0 :(得分:1)
当您进行比较时,您在加密密码时正在腌制,而且数据库中的密码仅被加密。
if(crypt($password_entered, $password_hash) == $user->password) {
另外,根据文档,你应该像这样比较
你应该将crypt()的整个结果作为salt传递给 比较密码,以避免在不同的散列时出现问题 使用算法。 (如上所述,标准的基于DES的密码 散列使用2个字符的盐,但基于MD5的散列使用12。)
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) {
echo "Password verified!";
答案 1 :(得分:0)
修复此if语句:
if(hash_equals(crypt($password_entered, $password_hash), $password_hash))
{
echo "WORKS";
}
或者因为PHP 5.4中没有hash_equals
:
if(crypt($password_entered, $password_hash) == $password_hash)
{
echo "WORKS";
}
但如果没有hash_equals
,您的哈希很容易受到timing attack的攻击。</ p>
您也可以阅读this manual。