Php 用于使用salt验证用户的单个查询

Php 用于使用salt验证用户的单个查询,php,mysql,mysqli,Php,Mysql,Mysqli,我有一张有三栏的桌子:email、pass、salt 当用户登录时,我收到了电子邮件并通过了——但不是盐。如何通过单个查询验证用户 这就是我试图做的(但显然有缺陷): 谢谢大家! 在您试图使用数据库创建哈希时,数据库中没有用户 当使用基于salt的散列时,您通常会从DB中选择用户salt和密码(以及稍后可能需要的其他信息,如用户ID)。并在应用程序中进行哈希比较。不能在大括号内使用函数:{hash\u mac(… 使用以下命令: $query = "SELECT users.salt FROM

我有一张有三栏的桌子:email、pass、salt

当用户登录时,我收到了电子邮件并通过了——但不是盐。如何通过单个查询验证用户

这就是我试图做的(但显然有缺陷):


谢谢大家!

在您试图使用数据库创建哈希时,数据库中没有用户


当使用基于salt的散列时,您通常会从DB中选择用户salt和密码(以及稍后可能需要的其他信息,如用户ID)。并在应用程序中进行哈希比较。

不能在大括号内使用函数:
{hash\u mac(…

使用以下命令:

$query  = "SELECT users.salt FROM users WHERE email='$email' AND password='";
$query .= hash_hmac('sha256', $password, users.salt) . "'";
但是仍然存在一个问题。
users.salt在PHP上下文中不可用。您必须首先获取它:

// get salt (pseudo code):
$salt = db_query("SELECT users.salt FROM users WHERE email = '$email'");

// use it in the query
$query  = "SELECT users.salt FROM users WHERE email='$email' AND password='";
$query .= hash_hmac('sha256', $password, $salt) . "'";

主题外:我发现这很有趣,下面是一个如何在大括号内使用函数的基本示例。我在示例中使用了
rand()
函数:

$rand = 'rand';
echo "{$rand()}";

您在这里以一种无法实现的方式混合了PHP和SQL

这是一种非常糟糕的做法:

SELECT * FROM users
  WHERE email=:email
    AND SHA2(CONCAT(:password, salt), 256)=:hashed
请注意,这将导致对数据库中的所有用户记录进行行扫描,并将执行非常糟糕的操作。这就是为什么在生产代码中从未使用此方法的原因

您要做的是获取特定电子邮件的salt,对提供的密码进行哈希,然后将结果与保存的哈希值进行比较:

SELECT * FROM users WHERE email=:email

如果您使用库而不是编写自己的库,则可能不会出现这些问题。至少您没有使用MD5。

在编写更多SQL代码之前,请仔细阅读以避免出现令人讨厌的问题。您需要使用SQL占位符和。您不能在查询中内联
$email
之类的内容。谢谢您提供的链接,但是我已经知道这一点-我只是简化了查询。不要通过这样做来“简化”查询。如果必须这样做,请使用
WHERE email=?
之类的内容。不管您的意图如何,这里的内容都是一个鲁莽编程的示例。请尝试修改
hash\u hmac()的第三个参数
可能只需要通过电子邮件获取salt和密码,然后检查密码是否与加密匹配?
用户。salt
失败尝试引用“salt”用户表上的列。您的示例代码不起作用的原因与OP不起作用的原因相同。这严重需要正确的转义或
$
值被删除并替换为占位符。Yikes.@FrankFarmer是的,我现在明白了。这将扩展我的答案。但是,花括号中不允许使用函数这是一个双重查询,这是我目前使用的你应该在问题中告诉他;)但是,Mike的答案应该是你想要的可能有人不喜欢PDO。如果他留下了评论,我们就会知道…:|但是,这是正确的,尤其是
不要使用md5()
部分应该注意
SELECT * FROM users WHERE email=:email