我不确定正确的技术措辞,请原谅我的头衔,但这就是问题所在。我有一个MySQL数据库,在用户表中我有* user_name *,a * password_salt *和一个md5 密码,其中包含密码然后是salt。在程序中,用户连接并且我得到一个要发送的查询以验证用户。 当用户连接时,我需要一种方法来选择他们的user_name,并将给定的密码与存储的密码进行比较,这需要在WHERE语句中的某处检索盐(我猜)。
这是我假设的“例子”:
SELECT user_name
FROM users
WHERE user_name='$nick' AND
password = md5(CONCAT('$md5pass', md5((select password_salt FROM users where user_name='$nick'))))
LIMIT 1
解决方案更新:得到了它的工作,感谢您的建议,正常的选择已经足够,问题是sql-auth api没有收到密码,除非指定了端口。
答案 0 :(得分:1)
实际上你可以自由地使用“FROM”子句中声明的表中的任何列,不仅在“SELECT”子句中,而且在“WHERE”子句中,所以我在这里看不到需要子查询。简而言之:
SELECT user_name
FROM users
WHERE user_name='$nick' AND
password = md5(CONCAT('$md5pass', md5(password_salt)))
LIMIT 1
这样,只有在匹配两者时才选择行: - 用户名是正确的 - 行中的密码匹配给定密码
我不确定我是否正确使用了md5()函数。我复制了你的例子。
答案 1 :(得分:0)
SELECT user_name 来自用户 WHERE user_name ='$ nick'AND 密码= md5(CONCAT('$ md5pass',password_salt)) 限制1
答案 2 :(得分:0)
请改为尝试:
SELECT user_name
FROM users
WHERE user_name='$nick' AND
password = md5(CONCAT('$md5pass', md5(password_salt)))
LIMIT 1