Php 如何在数据库中检查密码匹配?
今天我发现了一个名为CryptoLib的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 ?
$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')如果您使用的是*NIX系统,则演示文件中的代码>可能会引发错误。如果您使用的是它(而不是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')如果您使用的是*NIX系统,则演示文件中的代码>可能会引发错误。如果您使用的是它(而不是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这不是它的工作方式。综上所述,,