验证SHA512密码if($ row ['password'] == hash('SHA512',$ upass))

时间:2015-07-12 12:38:44

标签: php authentication sha512

当用户在我的网站上创建帐户时,他们的密码将使用SHA512存储。我的问题是当用户尝试使用他们的密码登录时,我相信我正在验证密码不正确,但我无法看到我做错了什么。

这是我的注册脚本:

 $uname = mysql_real_escape_string($_POST['uname']);
 $sname = mysql_real_escape_string($_POST['sname']);
 $email = mysql_real_escape_string($_POST['email']);
 $upass = mysql_real_escape_string($_POST['pass']);

 $upass = hash('SHA512', $upass);

密码'Test'以数据库形式存储在数据库中:

ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f88

这是我的登录脚本:

if($row['password']==hash('SHA512', $upass))
 {
  $_SESSION['user'] = $row['user_id'];
  header("Location: account.php");

如果有任何正文可以请编辑我的登录代码,以便它可以检索并验证SHA512字符串,那么将非常感谢。

我并不担心完全更改我的登录系统以使其更安全,这是一个非常简单的系统,仅用于存储用户对网站的偏好,我们可能只是厌恶使用SHA512。

2 个答案:

答案 0 :(得分:2)

  

这是php版本的hash_equals()> = 5.6.0如果您使用的是较低版本,那么您可以使用下面的代码。

if(!function_exists('hash_equals')) {
  function hash_equals($str1, $str2) {
    if(strlen($str1) != strlen($str2)) {
      return false;
    } else {
      $res = $str1 ^ $str2;
      $ret = 0;
      for($i = strlen($res) - 1; $i >= 0; $i--) $ret |= ord($res[$i]);
      return !$ret;
    }
  }
}
  

匹配哈希。

$expected  = crypt('Test', '$2a$07$addsomecustomstring$');
$correct   = crypt('Test', '$2a$07$addsomecustomstring$');
$wrong = crypt('tets',  '$2a$07$addsomecustomstring$');

var_dump(hash_equals($expected, $correct)); //true
var_dump(hash_equals($expected, $wrong)); //false

答案 1 :(得分:-1)

由于您已经计算了哈希值,因此不再需要再次调用哈希函数:

if($row['password']==$upass)

而不是:

if($row['password']==hash('SHA512', $upass))