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

PHP哈希登录问题

束帅
2023-03-14

在密码散列方面,我有点像n00b,所以对我来说很简单。基本上,我已经整理了一些代码,首先清理用户在注册时输入的字符串。一旦完成,就会生成随机盐。然后将密码附加到salt:

  $salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));

    $saltedPW =  $p . $salt;

然后,我使用sha256对密码进行哈希处理,然后继续将用户插入数据库,这似乎都正常工作:

   $hashedPW = hash('sha256', $saltedPW);

    $q = "INSERT INTO user (id, name, email, password, verified, user_level, salt) VALUES
    (NULL, '$n', '$em', '$hashedPW', 'no', '1', '$salt')";

    $r = @mysqli_query ($dbc, $q); //run the query

然后,当涉及到用户登录时,我再次清理用户输入的字符串,从数据库中获取salt并将其分配给变量,然后将密码附加到该变量,如下所示:

       $saltQuery = "SELECT salt FROM user WHERE email = '$email'";

        $result = mysqli_query($dbc, $saltQuery);

        $row = mysqli_fetch_assoc($result);

        $salt = $row['salt'];

        $saltedPW =  $password . $salt;

然后,像以前一样,使用sha256对加盐密码进行哈希运算,我尝试从数据库中获取用户信息:

    $hashedPW = hash('sha256', $saltedPW);

      $query = "SELECT * FROM user WHERE email = '$email' AND password = '$hashedPW'";

        $r = @mysqli_query ($dbc, $query);

但是,登录失败了,当我打印出查询结果时,我得到了以下结果,当我假定密码应该等于用户输入的字符串时,在本例中是用于测试目的的“password ”:

  SELECT * FROM user WHERE email = 'test@test.com' AND password = '5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8'

你能看到我做错了什么会导致登录失败吗?谢谢

共有1个答案

江向阳
2023-03-14

SHA256是一个消息摘要,而不是一个密码散列函数,因此您当然不应该这样使用它。

密码学很难,要做好它就更难了——正因为如此,您应该避免使用自己的加密函数,而使用经过验证的函数,如bcrypt或较新的scrypt。

PHP通过password_hash函数提供对bcrypt alogirthm的访问,该函数自动生成盐并使用比SHA256更高程度的安全性加密密码。您可以这样使用它:

$hashedPassword = password_hash($password);

然后,当用户登录时,您将使用相同的函数对他输入的密码进行哈希处理,并从数据库中检索该用户。

 类似资料:
  • 我已经对我的注册脚本中的密码进行了加密,它们存储在数据库中,我必须使用它们登录,所以我想使用未加密的密码登录。我已经阅读了这里的一些帖子,但没有任何帮助。我如何才能将其添加到我的登录中。php?盐也存储在数据库中。 这是我的登记簿。用于加密的php脚本 这是我的季节login.php

  • 我记得读过一个方案,其中检查密码的过程是这样的: 给定数据库中的(哈希、盐)值, 用salt哈希密码以检查哈希, 使用旧哈希作为salt的哈希密码, 在数据库中存储(新哈希,也称为旧哈希) 我找不到原始来源无论如何,我不明白 > < li> 使用旧哈希作为salt的优势是什么(与使用随机salt相反), 这种方案的优点是什么(进一步使彩虹表攻击复杂化?),以及 如果有优势,如何使用PHPass应用

  • 我必须为我们新的Laravel 5.6网站使用一个旧的用户数据库。现在我有办法要求所有用户重新制作密码。旧址为joomla 3.7。在玩了一会儿之后,我发现,在登录Joomla 3.7时检查密码。5用过。。。 要设置新用户的密码... 我在Laravel找到了大约6个地方可以改变... 我就是找不到登录挑战? LoginController中没有任何内容。 所以真正的问题是登录在哪里-

  • 我是相对较新的PHP,刚刚开始掌握盐的点,当谈到散列密码(我想?)。不管怎样,这是我的问题... 现在我有一个mysql数据库,用户名,密码,盐字段。密码字段长度为64个字符,盐字段为3个字符。在注册时,每个用户名被分配一个随机的盐。我对此没有任何问题(我相信)。首先,通过以下方式散列用户所需的密码: 然后,通过以下过程将用户所需的密码与pbkdf2中包含的盐进行散列,并将其输入数据库: 我的问题

  • 多亏了最近一篇文章中的一些好建议,我才从中实现了PBKDF2https://defuse.ca/php-pbkdf2.htm进入一个小的PHP图像库,我正在建设教自己一些PHP。 我知道您将salt和hash存储在数据库中,然后在用户输入密码时重新构建它们以匹配。我不明白的是,当上面网站上的validate_password函数为同一个密码生成不同的、唯一的salt时,它是如何工作的。 例如,我创

  • 哈希是键/值对 如果你想按名字查询,那么需要哈希。哈希的键必须唯一,但值可以是任意标量。 有时候你仍然会看到人们称它为“关联数组”,但不要想当然的把它作为数组。 通过键/值对列表来创建哈希 使用键/值对列表创建哈希: my %stooges = ( 'Moe', 'Howard', 'Larry', 'Fine', 'Curly', 'Howard', 'Iggy'