检查存储在mysql中的md5(密码)匹配值

时间:2012-11-28 14:03:34

标签: php md5

我无法理解为什么这不起作用。 在注册时我有(在PHP中)

$data['salt'] = randomStr(3);
$data['password'] = md5($data['salt'].md5($data['password']));

然后我有一个IOS应用程序将MD5加密的pw($ xpassword)传递给Web应用程序。 所以我想如果我使用:

$q1_result = mysql_query("SELECT password, salt FROM `members` WHERE `username`='". $username. "'");
$row = mysql_fetch_array($q1_result);
echo "this should match? = " .md5($xpassword.($row['salt']));

echo'd值应与存储在数据库中的值匹配为

......但事实并非如此 任何帮助将不胜感激

3 个答案:

答案 0 :(得分:8)

它不匹配,因为您的订单错误:

md5($row['salt'] . $xpassword)

在第一个代码中,您有salt + password,在第二个代码中,您有password + salt

正如@Michael所指出的,你是双重密码,这意味着它不匹配。

答案 1 :(得分:3)

您正在对密码部分进行双重哈希:

// Don't pre-hash the password before hashing with the salt!
$data['password'] = md5($data['salt'].md5($data['password']));
//---------------------------------^^^^^^^^^

您应该只对整个salt和密码串联进行哈希处理。

// Hash only the entire combination of salt . password
$data['password'] = md5($data['salt'].$data['password']);

如前所述,反转测试中连接的顺序:

md5($row['salt'] . $xpassword);

答案 2 :(得分:0)

在SQL中,您需要连接字符串:

SELECT * FROM users WHERE username = 'blah' AND password = MD5(CONCAT(salt, password))