【发布时间】: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。