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

从数据库检索salt值时,我的哈希密码值不匹配

景恩
2023-03-14

我有个问题。从数据库检索salt值时,我的哈希密码值不匹配。

登记php

>

  • 用户输入用户名和密码。
  • 通过POST收集用户名和密码。
  • 生成随机盐值将盐值添加到密码值的末尾(由用户输入)。并散列全部值。
  • 将用户名、盐、hashed密码和原始密码插入数据库(仅用于测试)

    if (isset($_POST["usernameReg"]) && isset($_POST["passwordReg"])){
     // filter everything but numbers and letters
    $username = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["usernameReg"]); 
    $password = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["passwordReg"]); 
    
    $salt = openssl_random_pseudo_bytes(1024);
    
    $hashedPassword = hash('sha256', $password.$salt);
    //$hashedPassword1 = hash('sha256', $password);
    
    $query = "INSERT INTO users (username, salt, hashedPassword, password) VALUES (:username, :salt, :hashedPassword, :password)";
    
    $statement = $pdoConnection->prepare($query);
    $statement->bindValue(':username', $username, PDO::PARAM_STR);
    $statement->bindValue(':salt', $salt, PDO::PARAM_STR);
    $statement->bindValue(':hashedPassword', $hashedPassword, PDO::PARAM_STR);
    $statement->bindValue(':password', $password, PDO::PARAM_STR);
    $statement->execute();
    

    }

    登录。php

    >

    if(isset($_POST["用户名"])

        //check if this username and password exist in our database and are therefore valid
        $query = "SELECT * FROM users WHERE username=:username LIMIT 1";
    
        $statement = $pdoConnection->prepare($query);
        $statement->bindValue(':username', $username, PDO::PARAM_STR);
        $statement->execute();
        $statement->setFetchMode(PDO::FETCH_ASSOC);
    
        while($row = $statement->fetch()){
            $saltPassword = $password.$row["salt"];
            $newHashedValue = hash('sha256', $saltPassword);
            $dbHashedValue = $row["hashedPassword"];
            //these two values are not matching but they should match
            $_SESSION["newHashedValue"] = $newHashedValue;
            $_SESSION["dbHashedValue"] = $dbHashedValue;
        }
    

    }

  • 共有1个答案

    胥博文
    2023-03-14
    $salt = openssl_random_pseudo_bytes(1024); //will generate 2048 chars since a character is half a byte.
    

    将生成2048个字符的字符串。因此,解决方案是将salt列的大小增加到2048,这有点过分,或者生成32个字节,即64个字符。

    $salt = openssl_random_pseudo_bytes(32); //will generate 64 chars
    

    有关此函数的更多信息,请单击此处http://php.net/manual/en/function.openssl-random-pseudo-bytes.php

    sha256散列的长度为64,因此hashedPassword列的长度应为64。(顾名思义,256位=32字节=64个字符)

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

    • 所以我在学习PHP的过程中,正在开发一个登录页面。我已经想出了如何使用SHA256哈希$盐$密码注册新用户。我知道有一些比较慢的加密方法,比如bcrypt,但是出于学习目的,我只是使用SHA256。我的问题是,使用此加密后: 使用准备好的语句,从数据库中检索哈希密码的最佳方法是什么,以便我可以使用这样的函数验证它?

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

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

    • 我正在尝试实施一个工资系统,但我在更新员工方面遇到了一些问题。我已将员工的性别作为varchar存储在数据库中。当我输入员工id并单击搜索按钮时,我想从数据库中获取该信息,并根据数据以男性/女性单选按钮显示。代码中没有错误。但问题是,当我尝试这样做时,只有男性按钮显示为选中状态,这是默认设置。即使数据库上的数据显示为女性,女性单选按钮也不会被选中。有谁能帮我解决这个问题吗?下面是我的代码。

    • 在身份验证成功时,我正在编写以下代码: