当前位置: 首页 > 知识库问答 >
问题:

正在从数据库检索salt哈希以进行验证

申屠涛
2023-03-14

所以我在学习PHP的过程中,正在开发一个登录页面。我已经想出了如何使用SHA256哈希$盐$密码注册新用户。我知道有一些比较慢的加密方法,比如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;
}

共有2个答案

姬正文
2023-03-14

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

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

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

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

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

  1. 获取保存在数据库中的盐
利思源
2023-03-14

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

编辑

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

 类似资料:
  • 我有个问题。从数据库检索salt值时,我的哈希密码值不匹配。 登记php > 用户输入用户名和密码。 通过POST收集用户名和密码。 生成随机盐值将盐值添加到密码值的末尾(由用户输入)。并散列全部值。 将用户名、盐、hashed密码和原始密码插入数据库(仅用于测试) } 登录。php > if(isset($_POST["用户名"]) }

  • 我创造了一个这样的形式 如果它没有验证,我将重新显示填充了数据的表单。填充问题数据并不难 但是,我无法从答案模型(具有内容和链接字段)的会话哈希中获取嵌套值。这不起作用。 我觉得是因为hash对象中的0,1,2迭代。例如,这是hash对象的一个片段(完整显示在下面) 但我不知道在构建问题答案时如何表达这一点 当我尝试构建时,在尝试从哈希对象中提取数据时,我不会表示迭代。你能解释一下我如何修改这一行

  • 我正在开发一个应用程序,员工将首先通过输入loginID和密码注册到系统中。密码经过哈希和盐析并存储在登录表中(这两个值都与loginID值一起存储)。但是,当我逐步遍历代码并登录到应用程序时(在注册过程之后),哈希值和salt值永远不匹配。 当用户登录到系统时,我将如何验证他们的密码? 加密功能: 数据库调用:

  • 我有一个带有键和值的哈希映射(整数数组)

  • 问题内容: 我有一个dynamodb表来存储电子邮件属性信息。我在电子邮件上有一个哈希键,在时间戳(数字)上有范围键。使用电子邮件作为哈希键的最初想法是按电子邮件查询所有电子邮件。但是我想做的一件事是检索所有电子邮件ID(在哈希键中)。我为此使用了boto,但不确定如何检索不同的电子邮件ID。 我当前提取10,000条电子邮件记录的代码是 但是要检索不同的记录,我将必须进行全表扫描,然后在代码中选

  • 我正在两个标记之间画一条路线,我想保存那条路线。为此,我将包含lat和lng的ArrayList保存在Firebase数据库中。但我在取回航路点时遇到了问题。我是这样插入的: 在检索数据时,我尝试执行以下操作: