Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在数据库中检查密码匹配?_Php_Mysql_Hash_Password Encryption - Fatal编程技术网

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

Php 如何在数据库中检查密码匹配?,php,mysql,hash,password-encryption,Php,Mysql,Hash,Password Encryption,今天我发现了一个名为CryptoLib的php类,它有助于散列密码,但现在我不知道如何将其与数据库密码匹配 下面是脚本的使用方法,每次我重新加载页面时都会生成不同的散列 $string = $_POST['password']; echo $hash = CryptoLib::hash($string); 这一行上面的检查哈希是否匹配 $isHashCorrect = CryptoLib::validateHash($hash, $string); echo ($isHashCorrect ?

今天我发现了一个名为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'");
现在有人能告诉我如何匹配密码吗


要了解更多信息,请访问

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

例如,将结果绑定到比较:

$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");
在使用时。你应该使用的东西,以帮助防止你目前可能面临的风险

从我的评论中还注意到:

该库返回长度为256的字符串。确保数据库中的密码列不是255而是256+,因为这将在您身上悄无声息地失败

您甚至可能想使用PHP函数,但这完全是您的选择


footnotes:


此行
require_once('cryptolib.php')可能会引发错误。如果您使用的是它(而不是Windows),则它们区分大小写。它们的文件名为
CryptoLib.php
,与某些平台上的
CryptoLib.php
不同。

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

例如,将结果绑定到比较:

$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");
在使用时。你应该使用的东西,以帮助防止你目前可能面临的风险

从我的评论中还注意到:

该库返回长度为256的字符串。确保数据库中的密码列不是255而是256+,因为这将在您身上悄无声息地失败

您甚至可能想使用PHP函数,但这完全是您的选择


footnotes:


此行
require_once('cryptolib.php')可能会引发错误。如果您使用的是它(而不是Windows),则它们区分大小写。他们的文件名为
CryptoLib.php
,与某些平台上的
CryptoLib.php
不同。

您没有在“验证哈希”下查看过吗?您只需要从数据库中获取密码列,并将其与验证示例进行匹配。@Fred ii-是的,我已经阅读了,但无法正确理解,请您通过示例进行解释。请根据此问答-它使用
密码\u哈希()
,然而,简单地根据库中返回的散列进行验证并不困难(我不熟悉,但在这里应该与根据Q&a从db中获取的散列没有太大区别)。确保数据库中的密码列不是255而是256+,因为这将使您失败。我下载了这个库用于测试。同样,请根据我给您的链接将您的输入与db中的密码进行比较。如果你没有得到任何结果,请告诉我,等我有更多的时间时,我会用我的一个数据库来测试。@Fred ii-如果你想参加投票,就把它作为答案写下来。你没有在“验证散列”下看吗?您只需要从数据库中获取密码列,并将其与验证示例进行匹配。@Fred ii-是的,我已经阅读了,但无法正确理解,请您通过示例进行解释。请根据此问答-它使用
密码\u哈希()
,然而,简单地根据库中返回的散列进行验证并不困难(我不熟悉,但在这里应该与根据Q&a从db中获取的散列没有太大区别)。确保数据库中的密码列不是255而是256+,因为这将使您失败。我下载了这个库用于测试。同样,请根据我给您的链接将您的输入与db中的密码进行比较。如果你还没有得到任何结果,请告诉我,当我有更多的时间时,我会用我的一个数据库进行测试。@Fred ii-如果你想投票,请写为回答否。您应该在WHERE子句中检查密码。然后,您只需检查自己是否有结果行。这样,数据库就负责所有的哈希运算。@EJP这不是它的工作方式。在上面的代码中,
$result
是之前保存的哈希密码。您在where子句中从来没有密码。您可以通过验证函数进行验证。只要有人在where子句中有密码,你就知道他们做错了。@EJP在查看了你的PHP(标记)分数和与密码相关的答案后,你一点也没有给我留下印象。然而,你最有可能投的是反对票。你可以做你想做的事,像个疯子一样投反对票,尽管我不在乎,但你仍然觉得这是不必要的,如果这是你的反对票的话。我非常了解我的PHP和密码编码,谢谢。“我们不要在这里比较苹果和桔子。”Drew你可以看看我留给另一个人的东西,我想我的标签/代表分数说明了一切。顺便说一句,看看我更新的个人资料;这是不言自明的。谢谢你对我说的“六个字”;-)Fred,@EJP,我想对这个问题单独发布一个“一次性”答案,详细说明为什么
where子句
是比较密码的糟糕地方。我只是从来没有想到过它,以为人们可以用谷歌搜索它。我会在一周内回来。您应该在WHERE子句中检查密码。然后,您只需检查自己是否有结果行。这样,数据库就负责所有的哈希运算。@EJP这不是它的工作方式。综上所述,,