Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 回收盐&x2B;来自数据库的哈希以进行验证_Php_Mysql_Hash_Salt - Fatal编程技术网

Php 回收盐&x2B;来自数据库的哈希以进行验证

Php 回收盐&x2B;来自数据库的哈希以进行验证,php,mysql,hash,salt,Php,Mysql,Hash,Salt,因此,我正在学习PHP,正在开发一个登录页面。我已经知道如何使用SHA256来散列$salt+$密码来注册新用户。我知道有像bcrypt这样的较慢的加密方法,但出于学习目的,我只使用SHA256。我的问题是,在使用此加密后: function HashPassword($password) { $salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)); $hash = hash("sha256", $salt . $passwo

因此,我正在学习PHP,正在开发一个登录页面。我已经知道如何使用SHA256来散列$salt+$密码来注册新用户。我知道有像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;
}
原则是您无法检索密码;相反,您可以使用相同的
HashPassword
函数计算密码尝试的哈希值,然后查询数据库中的匹配记录


编辑

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

原则是您无法检索密码;相反,您可以使用相同的
HashPassword
函数计算密码尝试的哈希值,然后查询数据库中的匹配记录


编辑


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

基本上是将密码用salt散列保存,以使其无法识别

如果你的数据库在某个时候被黑客入侵,黑客就不能直接读取密码。相反,他必须重新创建散列值

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

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

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

  • 获取保存在数据库中的盐
  • 计算连接的has值
    hash=salt+password
  • 将计算的has与保存的has进行比较
    hash==savedHash
  • 如果它们相同,则为有效密码。如果不是,那就是一个错误的密码

  • 您基本上保存了用盐散列的密码,以使其不可识别

    如果你的数据库在某个时候被黑客入侵,黑客就不能直接读取密码。相反,他必须重新创建散列值

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

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

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

  • 获取保存在数据库中的盐
  • 计算连接的has值
    hash=salt+password
  • 将计算的has与保存的has进行比较
    hash==savedHash
  • 如果它们相同,则为有效密码。如果不是,那就是一个错误的密码

  • 那盐呢?我知道人们能够验证使用salt散列的登录。在这种情况下,由于它是随机生成的,我该如何准确地进行验证……我有点不知所措。@Jukodan:您的salt应该与您的记录一起存储。我将salt作为全局类变量(private)保存在include脚本中,在该脚本中我需要hash+salt。只需获取他们输入的密码,将您的salt添加到其中,将其存储在一个变量中,从数据库中检索他们已经散列的密码,并将两者进行比较。如果他们匹配,那么你是金色的,如果不匹配,那么他们输入了错误的密码,那么盐呢?我知道人们能够验证使用salt散列的登录。在这种情况下,由于它是随机生成的,我该如何准确地进行验证……我有点不知所措。@Jukodan:您的salt应该与您的记录一起存储。我将salt作为全局类变量(private)保存在include脚本中,在该脚本中我需要hash+salt。只需获取他们输入的密码,将您的salt添加到其中,将其存储在一个变量中,从数据库中检索他们已经散列的密码,并将两者进行比较。如果他们匹配,那么你是金色的,如果不匹配,那么他们输入了错误的密码是的,我理解这个概念,感谢你的进一步澄清。让我大吃一惊的是如何访问数据库中的连接哈希。从用户名为“$username”的用户密码中选择?@Jukodan您可以执行一个查询来检索salt和哈希密码:
    从用户名为“$username”的用户中选择hashedPW,salt
    。然后用PHP进行比较。重要的一点是为每个用户提供不同的盐,而不是一个全局的盐(在另一个答案上的评论听起来好像你只为所有用户提供了一个“盐”)。啊!我考虑过了,主要是因为当我查询数据库并回显结果时,我收到的是“resourced ID#2”,而不是预期的哈希密码。目前我正在使用:$salt=bin2hex(mcrypt_create_iv(32,mcrypt_DEV_uradom));为每个用户生成一个随机salt,然后存储hash=sa