在PHP中如何检查散列密码是否与数据库密码匹配

时间:2016-05-20 18:57:15

标签: php mysql hash

我的问题是在用户登录时登录页面我收到此错误sha256函数未在mysql中实现。我的代码是否有问题,或者是不再支持sha2了。还有其他方法在mysql中哈希密码。

  

警告:hash():未知的散列算法:sha2

create_account.php

//create account 
 $query = "INSERT INTO mytable (username,fname,lname,country,age,gender,password)
    VALUES ('$username','$fname','$lname','$country',$age','$gender',SHA2('$password', 224))";

的login.php

//check if password match 
$hased_password= hash("sha2", $password);
$hased_password= mysqli_real_escape_string($conn,$hashedPass);

  $query = mysqli_query($conn,"select * from mytable where password=  '$hased_password'  AND username='$username'");

 $rows = mysqli_num_rows($query);
if ($rows == 1) {
$_SESSION['username']=$username;  
$_SESSION['fname'] = $fname;
header("location: userPage.php");  
} else {
$error = "username or password is invalid";
}
mysqli_close($conn);

1 个答案:

答案 0 :(得分:2)

我以最好的意图给出以下答案。

。 。

我会引起你的注意PHP: Password Hashing Functions

和......

我会引起你的注意PHP Manual: PDO Prepared Statements

我的建议是使用Blowfish来散列你的密码。此外,您需要意识到时间攻击。因此,只是让数据库告诉您是否匹配哈希密码是一个答案,但这是一个糟糕的答案,因为关闭的失败尝试可以在微秒内测量(特别是因为互联网/网络位于攻击者之间和你的系统)。获得结果所需的时间越长,攻击系统就越接近(假设)拥有正确的哈希值。

(请记住,字符串比较逐个字符。字符串的内容无关紧要。)

非高峰时段的攻击可能会产生最佳结果。

使用PDO准备好的陈述。

在业务逻辑层中使用password_verify来确定哈希值是否匹配。仅使用数据库检索哈希。不要在数据层执行业务逻辑任务。不要依赖记录数。这是一个捷径。