我无法理解为什么这不起作用。 在注册时我有(在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值应与存储在数据库中的值匹配为
......但事实并非如此 任何帮助将不胜感激
答案 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))