0

所以我正在学习 PHP 并且正在处理登录页面。我已经想出了如何使用 SHA256 对 $salt+$password 进行散列来注册新用户。我知道有较慢的加密方法,如 bcrypt,但出于学习目的,我只使用 SHA256。我的问题是,在使用它加密之后:

function HashPassword($password) {
  $salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)); 
  $hash = hash("sha256", $salt . $password); column
  $final = $salt . $hash;
  return $final;
}

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

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;
}
4

2 回答 2

5

原理是无法找回密码;相反,您使用相同的HashPassword函数来计算密码尝试的哈希值,然后查询数据库以查找匹配的记录。


编辑

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

于 2012-04-27T07:25:13.453 回答
1

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

如果您的数据库在某个时候被黑客入侵,黑客将无法直接读取密码。相反,他将不得不重新创建散列值。

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

但是,如果每个密码都在密码中添加了不同的盐,那么在散列之前,黑客必须为每个密码创建一个新表,从而大大增加了获取真实密码所需的工作量。人们希望这将使黑客效率低下或成本过高。

对于您作为想要验证登录凭据的编码人员,您必须遵循以下模式:

  1. 获取保存在数据库中的盐。
  2. 计算连接的 has 值hash = salt + password
  3. 比较计算的和保存的hash === savedHash
  4. 如果它们相同,则它是有效密码。如果不是,那就是密码错误。
于 2012-04-27T07:34:15.813 回答