1

我不明白为什么这不起作用。在注册时我有(在 php 中)

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

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

$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']));

回显的值应与存储在数据库中的密码相匹配

...但它没有任何帮助将不胜感激

4

3 回答 3

8

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

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

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

正如@Michael 还指出的那样,您正在对密码进行双重哈希处理,这意味着它不会匹配。

于 2012-11-28T14:05:27.803 回答
3

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

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

您应该只散列盐和密码的整个串联。

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

如前所述,颠倒测试中串联的顺序:

md5($row['salt'] . $xpassword);
于 2012-11-28T14:05:35.250 回答
0

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

SELECT * FROM users WHERE username = 'blah' AND password = MD5(CONCAT(salt, password))
于 2012-11-28T14:09:20.387 回答