【问题标题】:About hashing passwords with argon2i关于使用 argon2i 散列密码
【发布时间】:2018-12-10 14:12:33
【问题描述】:

我设置了一个开发服务器,并安装了带有 php-fpm 和 7.2 php 的 nginx(我安装了所有必要的 php 包)。

现在是使用 argon2i 算法升级所有登录安全性的时候了。 所以,我尝试了这个(在开发环境中测试代码。代码中的安全性,稍后会出现):

require('connector.php');

$usr_u = $_POST['username'];
$psw_u = $_POST['password'];

$usr = mysqli_real_escape_string($conn, $usr_u);
$psw = mysqli_real_escape_string($conn, $psw_u);

$f_pass = password_hash($psw, PASSWORD_ARGON2I);

$result = "SELECT `username` FROM `users` WHERE username = '$usr'";
$tbl = mysqli_query($conn, $result);

$table = $tbl->fetch_assoc();
$m_user = $table['username'];

if ($m_user == $usr)
{
//correct username
    echo 'Correct username!<br>';

    $result = "SELECT `password` FROM `users` WHERE username = '$m_user'";
    $tbl = mysqli_query($conn, $result);

    $table = $tbl->fetch_assoc();
    $m_pass = $table['password'];


    if (password_verify($m_pass,$f_pass)) //always returns false
    {
        echo 'Password correct!<br>';
    }
    else
    {
        echo 'Wrong password!<br>';
    }
}
else
{
    echo 'Wrong username!<br>';
}
//close connection
mysqli_close($conn);

我总是得到“正确的用户名!”和“密码错误!”。我在来自数据库和输入的哈希密码上使用了 echo,我看到每次哈希密码都是不同的。我假设散列过程包括使用随机盐,这是我的问题。

据我了解,为了保持散列的安全性,随机盐是必要的。

您能否指出正确的方向,如何解决这个问题?我的数据库中有散列密码,但我想不出一种方法来对照我的数据库中的密码检查输入密码(使用 password_verify 和 hash_equals)。

提前感谢大家的帮助。

【问题讨论】:

  • $psw = mysqli_real_escape_string($conn, $psw_u); $f_pass = password_hash($psw, PASSWORD_ARGON2I); — 在将数据库放入数据库之前转义数据库,而不是在散列之前!密码哈希不是数据库!! (无论如何不要手动转义,使用准备好的语句/绑定参数)
  • 更好的是,不要逃避,而是使用parameterized queries

标签: php security hash


【解决方案1】:

查看password_verify的文档:

bool password_verify ( string $password , string $hash )

第一个参数是密码,但您传递给它您要与之比较的哈希

第二个参数是您想要与之比较的哈希值,但您传递给它的是根据用户输入创建的新哈希值

password_verify($_POST['password'], $m_pass)

【讨论】:

  • 就是这样。非常感谢您的帮助。当我阅读文档时,我认为我需要从用户那里传递散列密码。再次感谢您。
猜你喜欢
  • 2021-10-14
  • 2020-07-16
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2018-05-16
  • 2017-06-26
  • 2010-12-22
  • 2019-03-19
相关资源
最近更新 更多