从 md5 更改为 password_hash

Posted

技术标签:

【中文标题】从 md5 更改为 password_hash【英文标题】:Changing from md5 to password_hash 【发布时间】:2019-06-11 09:13:51 【问题描述】:

我正在关注有关创建 cms 的教程,但讲师使用 md5 作为密码,我正在尝试将其更改为使用 password_hash。我的 sql 数据库中使用的密码确实使用了 password_hash,但我对如何在我的登录页面中验证它感到困惑。

我尝试在登录页面中将 md5 更改为 password_hash,但这不起作用,我也尝试过 password_verify。我知道应该使用这些,但不知道我应该在哪里以及应该改变什么。

<?php

session_start();

include_once('../includes/connection.php');


if (isset($_SESSION['logged_in'])) 
    ?>
    <html>
    <head>
    <title>CMS Tutorial</title>
    <link rel="stylesheet" href="../assets/style.css"/>
    </head>

    <body>
        <div class="container">
        <a href="index.php" id="logo">CMS</a>

        <br />

        <ol>
            <li><a href="add.php">Add Article</a></li>
            <li><a href="delete.php">Delete Article</a></li>
            <li><a href="logout.php">Logout</a></li>

        </ol>


    </div>  
    </body>
</html>



    <?php

else
    if (isset($_POST['username'], $_POST['password'])) 
        $username = $_POST['username'];
        //$password = md5($_POST['password']);
        $password = password_hash($_POST['password'], PASSWORD_DEFAULT);

        if (empty($username) or empty($password))
            $error = 'All fields are required!';
        else
            $query = $pdo->prepare("SELECT * FROM users WHERE user_name = ? AND user_password = ?");

            $query->bindValue(1, $username);
            $query->bindValue(2, $password);

            $query->execute();

            $num = $query->rowCount();

            if ($num == 1) 
                $_SESSION['logged_in'] = true;
                header('Location: index.php');
                exit();
                //user entered correct details
            else
                //user entered false details
                $error = 'Incorrect details!';
        
    
    
    ?>

    <html>
    <head>
    <title>CMS Tutorial</title>
    <link rel="stylesheet" href="../assets/style.css"/>
    </head>

    <body>
        <div class="container">
        <a href="index.php" id="logo">CMS</a>

        <br /><br />

        <?php if (isset($error))  ?>

        <small style="color:#aa0000"><?php echo $error; ?></small>
        <br /><br />

        <?php  ?>


        <form action="index.php" method="post" autocomplete="off">
            <input type="text" name="username" placeholder="Username" />
            <input type="password" name="password" placeholder="Password" />
            <input type="submit" value="Login" />
        </form> 
    </div>  
    </body>
<html>

    <?php


?>

目前我刚刚收到

“不正确的细节”错误

我创建的,如果我使用 password_verify 我会得到 ​​p>

“所有字段都是必填错误”

【问题讨论】:

password_verify() in the manual 您提供的代码多于与问题核心相关的代码。尝试将其归结为您的要求。 【参考方案1】:

要检查密码,您必须使用password_verify() 函数,而不是password_hash()

前段时间我写了一个规范的例子,Authenticating a user using PDO and password_verify()。

如您所见,代码非常简单:您只需选择密码,然后使用password_verify()进行比较

$stmt = $pdo->prepare("SELECT * FROM users WHERE user_name = ?");
$stmt->execute([$_POST['username']]);
$user = $stmt->fetch();

if ($user && password_verify($_POST['password'], $user['password']))

    $_SESSION['logged_in'] = true;
    header('Location: index.php');
    exit();
else
    $error = 'Incorrect details!';

【讨论】:

嗨,我尝试了你所说的,它出现了“未识别的索引:密码”,并且它用于该行: if ($user && password_verify($_POST['password'], $ user['password'])),我可能会遗漏什么? 这正是它所说的。必须是数据库中的 user_password。 是的,原来是这样,只是有点傻,非常感谢您的帮助,现在完美运行

以上是关于从 md5 更改为 password_hash的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 将密码加密从 SCRAM 降级为 md5

如何将python字符串更改为无符号字符数组?

仅将月份从'jan'更改为1,'feb'更改为2,'mar'更改为3 ...'dec'更改为12 [重复]

网络传输与加密

PHP比md5更安全的加密方式--哈希密码

我可以随时将我的应用程序从免费更改为付费或从付费更改为免费吗?