0

我正在尝试使用 phpmysql 使用密码哈希。问题是 password_verify 到目前为止似乎对我不起作用。比如说,我注册时的密码是“123456789”。我使用将它存储在数据库中

    password_hash('123456789', PASSWORD_BCRYPT, array('cost' => 12));

然后当我在登录字段中输入“123456789”时,它什么也不做,失败了。

这是我的代码:

<?php
        session_start();
        include('db.php');        
?>

<!DOCTYPE html>

<head>

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <link rel="stylesheet" type="text/css" href="style.css"/>

</head>

<body>

<p/>

<?php

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

        $loginEmail = $_POST['loginEmail'];
        $loginPassword = $_POST['loginPassword'];

        $sqlLogin = $db->prepare("SELECT * FROM registered_users WHERE email = ?");

        $sqlLogin->bind_param("s",$loginEmail);
        $sqlLogin->execute();
        $sqlLogin = $sqlLogin->get_result();
        $numrowsLogin = $sqlLogin->num_rows;

        if($numrowsLogin == 1) {
            $rowLogin = $sqlLogin->fetch_assoc(); 
            $stored_password = $rowLogin['password'];

        }
        if(password_verify($loginPassword, $stored_password)){


           header('Location: homepage.php'); 
        }else{
            echo 'invalid login';
        }      

    }         
?>


    <form action = "<?php echo $_SERVER['PHP_SELF'];?>" method="POST">
        <table style="width:500px">                        
            <tr>
                <td width="30%"><input style="width: 200px; height: 25px; border-radius: 5px;" type="text" name="loginEmail" placeholder = "Email" required/><br/></td>
            </tr>                    
            <tr>
                <td width="30%"><input style="width: 200px; height: 25px; border-radius: 5px;" type="password"  name="loginPassword" placeholder = "Password" required/><br/></td>
            </tr>
        </table>

        <input style="font-weight: bold; width: 70px; height: 25px; border-radius: 5px;" type="submit" name="login" value="Login"/>
    </form>

</body>

</html>
4

3 回答 3

3

@Fred Li:谢谢,这对我有用。我在数据库中的密码列长度是 50。更新它并且现在可以使用,再次感谢您!——比什瓦鲁普查克拉博蒂”

正如评论中所讨论的:

来自http://php.net/manual/en/function.password-hash.php的示例

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a是 60 个字符。

您的密码列的长度小于 60,这就是问题所在。

它太短了,您的代码因此而静默失败,您需要在更改列的长度后重新开始使用新的哈希。

  • 手册说 255 是一个不错的选择。

笔记:

请注意关于 XSS 注入的其他评论。

这里有几篇不错的文章:

exit;在标题之后添加。否则,您的代码可能要继续执行。

于 2016-07-06T14:39:01.170 回答
0

如果新人在验证足够的数据存储后仍然遇到错误(例如varchar255:)

一定要string在 verify-password 函数中使用 unhashed。

verify_password($unhashed-string, $hashed-string)

我失去了几个小时的睡眠,将散列传递给string函数的第一个参数。

于 2020-10-13T11:04:56.530 回答
0

我正在使用河豚算法来散列密码。它对我来说已经成功运行,所以你可以试试这个。

<?php

$pass = "test678";

$hash = password_hash($pass, PASSWORD_BCRYPT);  //password_hash() function hash given password

$matchpass = "test678";

$match = password_verify($matchpass, $hash); // password_verify() function hash given boolean value if password can match so it return 1 otherwise 0

if ($match == true) {
    echo "Password can match successfully......";
} else {
    echo "Password cannot match please try again.";
}

?>

输出:

密码可以匹配成功......

于 2020-10-19T15:35:35.000 回答