【问题标题】:How to check a hashed password against database如何根据数据库检查散列密码
【发布时间】:2018-03-12 08:50:05
【问题描述】:

我正在检查输入的用户名和密码是否与存储在 mysql 数据库中的用户名和密码相同。

我使用password_hash() 对密码进行哈希处理并将它们存储到表中。但我不知道,如何检查它们是否相同。

HTML

<!DOCTYPE HTML>  
<html>
<head>
<style>
    .error {color: #FF0000;}
</style>
</head>
<body>

<h2>PHP Form Validation Example</h2>
<p><span class="error">* required field.</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">  
Username: <input type="text" name="username">
<span class="error">* <?php echo $usernameErr;?></span>
<br><br>
Password: <input type="password" name="password">
<span class="error">* <?php echo $passwordErr;?></span>
<br><br>
<input type="submit" name="submit" value="Submit">

</form>
</body>
</html>

PHP

<?php
error_reporting(E_ALL | E_STRICT);

$servername = "localhost";
$serverUsername = "root";
$serverPassword = "";

// Create connection
$conn = mysqli_connect($servername, $serverUsername, $serverPassword);
mysqli_select_db($conn, 'users');

// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";

if (isset($_POST["submit"])) {
    $query = mysqli_prepare($conn, "SELECT * FROM user_logons WHERE Username = ? AND Password = ?");
    mysqli_stmt_bind_param ($query , 'ss' , $username , $password);
    mysqli_stmt_execute($query);
    $username = mysqli_real_escape_string($conn, $_POST["username"]);
    $password = password_hash($_POST["password"], PASSWORD_BCRYPT);
    mysqli_stmt_close($query);

}

$usernameErr = $passwordErr = "";

mysqli_close($conn);
?>

另外,如果密码输入经过哈希处理,我是否必须对其进行转义?

【问题讨论】:

    标签: php mysql sql password-hash php-password-hash


    【解决方案1】:

    您需要再次对input 密码进行哈希处理,然后将其与您的prepare 语句绑定。您需要确保,您使用的加密方法与用于存储的加密方法相同。

    $username = mysqli_real_escape_string($conn, $_POST["username"]);
    $password = password_hash($_POST["password"], PASSWORD_BCRYPT); 
    
    mysqli_stmt_bind_param ($query , 'ss' , $username , $password);
    mysqli_stmt_execute($query);
    

    已编辑:

    正如@Devon 在评论中所建议的,您也可以使用 password_verify

    【讨论】:

    • 你真的应该使用 password_verify
    • 如何使用 password_verify?
    • @Justanotherprogrammer 假设username 是唯一的,然后选择特定用户名的密码,然后进行比较。
    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 2019-09-13
    • 2013-04-23
    • 1970-01-01
    • 2018-04-16
    相关资源
    最近更新 更多