是否有更简洁的方法来检查哈希密码?

时间:2017-07-12 20:52:13

标签: php mysql mysqli php-5.5

到目前为止,我如何检查散列密码以下是否有一种方法可以使这种更清洁,如果数据库变得比家庭/大学的测试变得更大,可能更快?

<?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,但我的原始问题是我验证数据是最好的方式还是有优化的方法呢?

1 个答案:

答案 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)