如何在数据库中检查密码匹配?

时间:2016-06-12 20:43:41

标签: php mysql hash password-encryption

今天我发现了一个名为CryptoLib的php类,它有助于哈希密码,但现在我很困惑如何将它与我的数据库密码相匹配。

以下是脚本的使用方式,每次重新加载页面时都会生成不同的哈希

$string = $_POST['password'];
echo $hash = CryptoLib::hash($string);

以上行检查散列是否匹配

$isHashCorrect = CryptoLib::validateHash($hash, $string);
echo ($isHashCorrect ? "TRUE" : "FALSE");

这是我的查询

mysqli_query($connec, "SELECT * FROM users WHERE email='$email' AND password='$password'");

现在有人可以告诉我如何匹配密码?

有关详细信息,请访问https://cryptolib.ju.je/

1 个答案:

答案 0 :(得分:2)

您基本上需要通过SELECT查询将提供的密码与数据库中的哈希值进行比较,并迭代给定的行,就像对PHP的password_verify()函数一样。

此示例以及将结果绑定到比较的位置:

$username = "email@example.com";
$password = "pass";

    if ($stmt = $con->prepare("SELECT `password` FROM `table` WHERE email = ? ")) {

        $stmt -> bind_param("s", $username);

        /* Execute it */
        $stmt -> execute();

        /* Bind results */
        $stmt -> bind_result($result);

        /* Fetch the value */
        $stmt -> fetch();

        /* Close statement */
        $stmt -> close();
    }

$isHashCorrect = CryptoLib::validateHash($result, $password);
echo ($isHashCorrect ? "TRUE" : "FALSE");

使用prepared statement时。你应该使用的东西,以帮助防止你目前可能的SQL injection

还注意到我的评论:

该库返回256个长度的字符串。确保数据库中的密码列不是255而是256+,因为静默会失败。

您甚至可能希望使用PHP的password_hash()功能,但这种选择完全属于您。

<强> Foonotes:

如果您使用的是* NIX系统,那么来自其演示文件的此行require_once('cryptolib.php');可能会引发错误。如果您使用它(而不是Windows),则区分大小写。他们的文件名为CryptoLib.php,在某些平台上与cryptolib.php不同。