首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证SHA512密码if($row[‘密码’]==hash(‘SHA512 512’,$upass))

验证SHA512密码if($row[‘密码’]==hash(‘SHA512 512’,$upass))
EN

Stack Overflow用户
提问于 2015-07-12 12:38:44
回答 2查看 1.4K关注 0票数 0

当用户在我的网站上创建一个帐户时,他们的密码将使用SHA512存储。我的问题是,当用户试图用他们的密码登录时,我相信我正在错误地验证密码,但是我看不出我做错了什么。

这是我的注册脚本,它可以工作:

代码语言:javascript
复制
 $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

这是我的登录脚本:

代码语言:javascript
复制
if($row['password']==hash('SHA512', $upass))
 {
  $_SESSION['user'] = $row['user_id'];
  header("Location: account.php");

如果有任何人可以编辑我的登录代码,以便它能够检索和验证SHA512字符串,那么我们将非常感谢。

我不担心完全改变我的登录系统,使它更安全,它是一个非常简单的系统,它只用于存储用户的首选项网站,请我们只是病态地使用SHA512。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-12 13:05:09

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

代码语言:javascript
复制
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;
    }
  }
}

匹配散列。

代码语言:javascript
复制
$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
票数 2
EN

Stack Overflow用户

发布于 2015-07-12 12:43:38

由于您已经计算了上面的散列,因此比较而言,不再需要再次调用散列函数:

代码语言:javascript
复制
if($row['password']==$upass)

而不是:

代码语言:javascript
复制
if($row['password']==hash('SHA512', $upass))
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31367850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档