首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从数据库中检索salt+hash以进行验证

从数据库中检索salt+hash以进行验证
EN

Stack Overflow用户
提问于 2012-04-27 15:22:37
回答 2查看 3.2K关注 0票数 0

因此,我正在学习PHP的过程中,正在开发一个登录页面。我已经知道如何使用SHA256对$salt+$password进行哈希操作来注册新用户。我知道有一些较慢的加密方法,比如bcrypt,但出于学习目的,我只使用SHA256。我的问题是,在使用这个加密之后:

代码语言:javascript
代码运行次数:0
运行
复制
function HashPassword($password) {
  $salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)); 
  $hash = hash("sha256", $salt . $password); column
  $final = $salt . $hash;
  return $final;
}

使用预准备语句,从数据库中检索散列密码的最佳方法是什么,以便我可以使用下面这样的函数对其进行验证?

代码语言:javascript
代码运行次数:0
运行
复制
function ValidatePassword($password, $hash_pass) {

  $salt = substr($hash_pass, 0, 64); 
  $trueHash = substr($hash_pass, 64, 64); 
  $reHash = hash("sha256" , $salt . $password); 

  return $reHash == $trueHash;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-27 15:34:16

基本上,您保存的密码散列了一个盐,使其无法识别。

如果你的数据库在某一时刻遭到黑客攻击,黑客不能直接读取密码。相反,他将不得不重新创建散列值。

如果您没有为每个用户使用不同的(随机)盐,黑客将只需要创建一个包含所有可能的散列值的表,并将其与您保存的散列密码进行比较。

然而,如果每个密码都有不同的盐添加到密码中,则在散列之前,黑客必须为每个单独的密码创建一个新的表,从而增加了获得真正密码所需的工作量。人们希望这将使黑客的效率低下或成本过高。

作为一名想要验证登录凭据的程序员,您必须遵循以下模式:

  1. 获取保存在数据库中的盐。
  2. 计算连接的hash = salt + password
  3. 的Has值将计算的has值与保存的hash === savedHash
  4. 进行比较如果它们相同,则它是有效的密码。如果不是,则是错误的密码。
票数 1
EN

Stack Overflow用户

发布于 2012-04-27 15:25:13

原理是您不能检索密码;相反,您可以使用相同的HashPassword函数来计算密码尝试的散列,然后查询数据库以查找匹配的记录。

编辑

再次查看您的HashPassword函数,我意识到您并不想在其中生成随机盐,而是将$salt作为参数;您将传入现有数据库记录中的值,或者根据需要传入随机生成的值。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10346429

复制
相关文章

相似问题

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