php - PasswordHash检查并登录

时间:2016-03-29 14:19:16

标签: php mysql hash passwords

我目前正在尝试使用php和mysql,并尝试使用html表单创建一个简单的注册和登录页面。

到目前为止,我已经创建了一个注册表单,其中包含用户信息,如姓名,电子邮件和密码。

为了安全地存储密码,我使用了PHPass,它使用散列函数来加密和存储我的数据库表中的密码。

到目前为止,我已经能够获取用户提交的密码,运行散列函数并将密码存储到我的桌面上。

我现在遇到的问题是,如何创建一个单独的HTML表单(登录),其中包含用户的电子邮件和密码,根据存储在表中的哈希密码检查密码以签署用户进入他们的帐户。

要保存我的密码:

require 'phpass/PasswordHash.php'; 

$user_password = ($_POST['password']);   

// Create a secure password 
$hasher = new PasswordHash(10, false); 
$user_password_hashed = $hasher->HashPassword($user_password);

然后,使用SQL查询:

$core_customer_insert = "INSERT INTO core_customer_information(firstname, lastname, email, password, activation_code, activated) VALUES ( 
                '".$conn->real_escape_string($first_name)."',
                '".$conn->real_escape_string($last_name)."',
                '".$conn->real_escape_string($email)."',
                '".$conn->real_escape_string($user_password_hashed)."',
                '".$conn->real_escape_string($code)."',
                '0')";

我将所需信息保存到表格中。

然后,我创建了一个新的.php文件,其中包含用于登录用户的脚本。

用于登录的HTML:

<form action="sign-in-script.php" method="POST"> 
    <table style="width:100%"> 
        <tr> 
            <th><input type="text" name="email" required placeholder="Email" /></th>
            <th><input type="password" name="password" required placeholder="Password" /></th>
            <th> <input class="button" id="sign-in-show" type="submit" value="Sign in" name="submit" /> </th>
        </tr>
    </table>
</form>

我的sign-in-script.php然后使用POST获取电子邮件地址和密码:

$email = $_POST['email']; 
$user_password = $_POST['password'];

然后我创建了一个SQL查询来检查电子邮件和密码是否与我表中存储的行匹配:

SELECT * FROM core_customer_information WHERE email='".$email."' AND password='".$user_password."' LIMIT 1

我无法理解的问题是,目前我的查询是检查db表中的密码是否与用作$ _POST的密码相匹配,但显然不会返回任何结果,因为它与安全存储的密码的散列版本不同。

我并不完全确定我应该根据db表上的散列版本检查表单中给出的密码。

使用的php库: PHPass

如果有人可以解释我用来解决问题的过程,我将不胜感激。

先谢谢,抱歉问题太大了。我试图尽我所能解释。

1 个答案:

答案 0 :(得分:3)

我建议从查询中删除AND子句,并在稍后阶段检查密码。像这样:

$query = mysqli_query($your_connection, "SELECT username, password FROM users WHERE username = '$username'");

    $result = mysqli_fetch_assoc($query);

    if (mysqli_affected_rows($your_connection) == 1) {
        if (password_verify($password, $result['password'])) {
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }

编辑:上面使用5.5 password_verify来检查存储在数据库表($result['password'])中的哈希是否与提供的密码($password)匹配

http://php.net/manual/en/function.password-hash.php