到目前为止,我如何检查散列密码以下是否有一种方法可以使这种更清洁,如果数据库变得比家庭/大学的测试变得更大,可能更快?
<?php
$pass = array();
$index =0;
$result = mysqli_query($db, "SELECT * FROM admins");
while ($row = mysqli_fetch_array($result)) {
$pass[$index] = $row['password'];
$newhash = $pass[$index];
if (password_verify($password, $newhash)) {
echo "Password Matched";
} else {
}
}
?>
编辑:已经指出要添加一个用户ID,但我的原始问题是我验证数据是最好的方式还是有优化的方法呢?
答案 0 :(得分:0)
正如克里斯所说,你真的应该只选择包含断言身份的行。虽然两个不同的管理员可能拥有相同的密码,但只要您使用password_hash()创建存储的密码,您的当前代码就不可能错过识别用户(因为每个帐户都应该获得随机分配的盐哈希); ccKep的评论可能是错误的。
这意味着像:
这样的查询SELECT password FROM admins WHERE username=?
这消除了在php代码中迭代结果集中多行的需要。
如果你还在用户名上添加索引,那么它会更快,因为dbms的工作量较少。唯一索引简化了检查重复帐户的问题。
由于散列密码的值取决于salt(每行实际上是唯一的),因此无法优化散列或密码的明文周围的查询性能 - 您需要使用断言的标识;格雷厄姆基于散列密码进行搜索的建议是错误的。
在实践中,如果网站具有任何重要的资产价值,您还应该限制登录率以防止暴力攻击,因此更好的查询看起来像:
SELECT password
FROM admins
WHERE username=?
AND 5 < (SELECT COUNT(*)
FROM login_failures
WHERE client_ip = INET_ATON( ? )
AND attempt_timestamp > NOW() - INTERVAL 30 MINUTE)