Php 更新字段验证密码?

Php 更新字段验证密码?,php,mysqli,password-hash,Php,Mysqli,Password Hash,好的,作为我教育的一个附带项目,我目前正在使用PHP和mysqli开发一个安全登录系统。事情一直进展顺利,但现在我遇到了一个令我的同学、老师和我感到困惑的问题 我正在通过密码散列和密码验证散列和检查我的密码 创建帐户时,所有内容都正确地存储在数据库中。然后,当我尝试使用正确的密码登录时,它会给我一个错误,即我的密码不正确 现在,关键是:当我进入PHPMyAdmin时,复制存储在数据库中的散列密码,并使用EXACT复制的密码更新密码字段。。。它起作用了。我可以按预期登录,使用我使用的密码,它不会给

好的,作为我教育的一个附带项目,我目前正在使用PHP和mysqli开发一个安全登录系统。事情一直进展顺利,但现在我遇到了一个令我的同学、老师和我感到困惑的问题

我正在通过密码散列和密码验证散列和检查我的密码

创建帐户时,所有内容都正确地存储在数据库中。然后,当我尝试使用正确的密码登录时,它会给我一个错误,即我的密码不正确

现在,关键是:当我进入PHPMyAdmin时,复制存储在数据库中的散列密码,并使用EXACT复制的密码更新密码字段。。。它起作用了。我可以按预期登录,使用我使用的密码,它不会给我任何错误

有人知道发生了什么事,以及如何解决吗

用于注册的代码:

public function createAccount()
{
    global $con;

    $this->password = password_hash($this->password, PASSWORD_DEFAULT)."\n";
    $sql='INSERT into user (username, password, email, creation_date)
        VALUES (?,?,?,?)';

    // Prepare statement
    $stmt = $con->prepare($sql);
    if($stmt === false) {
      trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $con->error, E_USER_ERROR);
    }

    // Bind parameters. Types: s = string, i = integer, d = double,  b = blob
    $stmt->bind_param('ssss',$this->username,$this->password,$this->email,$this->creationDate);

    // Execute statement
    $stmt->execute();

    echo $stmt->insert_id;
    echo $stmt->affected_rows;

    $stmt->close();

    $_SESSION['login'] = true;
    $_SESSION['username'] = $username;
    Header("Location: index.php");
}
用于验证凭据的代码:

public function fetchCredentials() {
    // Select a set of credentials from the username given in form and return as array
    global $con;
    $sql = 'SELECT id, password FROM user WHERE username = ?';

    // Prepare statement 
    $stmt = $con->prepare($sql);
    if($stmt === false) {
      trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $con->error, E_USER_ERROR);
    }

    // Bind parameters. Types: s = string, i = integer, d = double,  b = blob
    $stmt->bind_param('s',$this->username);

    // Execute statement
    $stmt->execute();

    // Store all results in an array
    $rs=$stmt->get_result();
    $arr = $rs->fetch_all(MYSQLI_ASSOC);
    $stmt->close();

    return($arr);
}

public function validateCredentials() {
    // Get credentials
    $arr = $this->fetchCredentials();

    // Validate username
    if (count($arr) > 1) {
        $this->error = 'crit';
        $this->abort = true;
    } else if (count($arr) < 1) {
        $this->error = 'badLogin';
        $this->abort = true;
    } else {
        $arr = $arr[0];
    }

    echo $arr['password'].'<br>'.$this->password;
    // Validate password. NOTE: This is where the issue arises. Password_verify() will return false where it    should return true.
    if ($this->abort == false && !password_verify($this->password, $arr['password'])) {
        $this->error = 'badLogin';
        $this->abort = true;
    }

    // Return values if needed
    if ($this->abort == false) {
        $this->id = $arr['id'];
    }
    return $this->abort;
}

好的,感谢所有帮助过我的人:谢谢。我的同学刚刚帮助我,他设法找到了问题所在。我现在正在打自己

$this->password = password_hash($this->password, PASSWORD_DEFAULT)."\n";

给你。“\n”。新行。我从一个示例中获取了我的代码,出于某种原因,它就在那里。当我更新数据库时,换行代码被删除。

你认为没有一行代码,有人能帮你做什么?请输入代码。但是,根据哈希不允许正确登录的经验,请确保您的DB Table列设置为text或一些不会切断哈希的大数字。您的帖子从一开始就很糟糕。。。您正在使用mysqli而不是PDO。。。您使用的是什么类型的散列?另外,请提供一个代码示例,以了解您正在处理的问题@Typhomism列被设置为varchar(255),因此应该可以。@RikPronk如果您在保存哈希值之前将其打印到屏幕上,请检查保存的值是否相同?
$this->password = password_hash($this->password, PASSWORD_DEFAULT)."\n";