来自DB的注册用户密码和登录时输入的密码不匹配

时间:2012-11-09 07:36:31

标签: php hash sha256

我已注册新用户并保存了用户名,密码和&使用以下散列方法在DB中使用盐:

    if(isset($_POST['register']))
    {
    $password = $_POST['password']

    function sanitize($data)
    {
        $data=trim($data);
        $data=htmlspecialchars($data);
        $data=mysql_real_escape_string($data);
        return $data;
    }

    $password = sanitize($password);

    function createSalt()
    {
        $salt = bin2hex(mcrypt_create_iv(32,MYCRYPT_DEV_URANDOM));
        $hash = hash("sha256", $salt);
        $final = $salt.$hash;
        return $final;
    }

    $hashedPassword = hash("sha256", $password);
    $salt = createSalt();
    $hashedPassword = hash("sha256", $hashedPassword.$salt);

    $query = sprintf("INSERT INTO users(username, password, salt) VALUES('%s','%s','%s')",$username, $hashedPassword, $salt);
}

稍后在尝试login.php时,我输入的密码是我在注册时保存的,并使用以下代码检查输入的密码是否与数据库中的密码相同

if(isset($_POST['login']]))
{
            $password = $_POST['password']

    function sanitize($data)
    {
        $data=trim($data);
        $data=htmlspecialchars($data);
        $data=mysql_real_escape_string($data);
        return $data;
    }

    function validateUser()
    {
        session_regenerate_id (); //this is a security measure
        $_SESSION['valid'] = 1;
        $_SESSION['username'] = $username;
    }

    $password = sanitize($password);

    $query = sprintf("SELECT * FROM users WHERE username = '%s'",$username);
    $sql = mysql_query($query);
    $count = mysql_num_rows($sql);

    $row = mysql_fetch_array($sql);

    if($count<1)
    {
        echo $count;
        unset($_POST['login']);
        header("location:login.php");
        exit;
    }

    $hash = hash("sha256", $password);
    $salt = $row['salt'];
    $hash = hash("sha256",$hash.$salt);

    echo $hash."<br />".$row['password']."<br /><br />";

    if($hash != $row['password'])
    {
        unset($_POST['login']);
        header("location:login.php");
        exit;   
    }
    else
    {
        validateUser();
        unset($_POST['login']);
        header("location:index.php");
        exit;   
    }
}

这些密码未匹配。 请告诉我这段代码有什么问题。

2 个答案:

答案 0 :(得分:0)

您的代码没有任何问题。

存储在数据库中的salt值被截断,因为varchar值很低,会将salt列的varchar值增加到200-300,而不是试试这个..它运行正常。

当我发现这搞砸了结果时,我很沮丧。

DINS

答案 1 :(得分:0)

实际上我不明白为什么这不起作用,你所显示的代码应该产生相同的值,也许你可以检查一下,你从数据库中读取的盐是否与你写入数据库中的相同

尽管如此,我还是不愿意继续走这条路,这里有很多问题。

  1. 首先,SHA-256不是散列密码的好选择,而是使用慢速密钥派生函数,如 BCrypt
  2. 你不应该在没有需要的情况下转义输入数据,如果你需要转义它们,你应该只针对特定的目标系统(htmlspecialcharsmysql_real_escape_string这样做是没有意义的,如果你要去无论如何都要计算哈希值。)
  3. 要创建一个salt,你可以使用随机源,这很好。在创建盐之后使用哈希,决不会使盐更随机。
  4. 数据库中不需要两个单独的密码和盐字段。 Php的crypt()函数将创建一个已包含salt的哈希值。
  5. 我邀请您阅读有关hashing passwords的本教程,您也会找到一个PHP示例,我建议使用phpass库。