2014-02-07 40 views
0

我一直在四处搜寻,无法找到我认为应该合乎逻辑的答案。我将包括用于在注册时插入的代码部分(以及适当的验证)以及用于希望您有想法的选择部分。在登录时检索盐腌的MD5密码PHP MySql

在注册页面上,我将密码插入随机唯一盐串和用户所需密码的MD5中。 (如果这不足以存储密码,我愿意提供改进的建议)。

$InsertQuery = "INSERT INTO login (firstname, lastname, username, password, salt, activation) VALUES ('$fnamePost', '$lnamePost', '$usernamePost', MD5('$salt$passwordPost'), '$salt','1')"; 

在登录页上我有以下的代码来检查密码:

$saltQuery = "SELECT * FROM login where username = '$username'"; 
$saltResult = mysql_query($saltQuery); 
$saltArray = mysql_fetch_array($saltResult); 
$saltPass = $saltArray['salt']; 
    $query = "SELECT * FROM login WHERE username = '$username' AND password = MD5('$saltPass$password')"; 


if($result1 = mysql_query($query)) { 
    if($success1 = mysql_num_rows($result1) > 0) { 

在这个“success1”点,它返回零行意不正确的用户名和密码。

打印查询本身我似乎得到一个MD5(saltpassword)搜索,但这不匹配存储在表中的密码。

我在这里错过了什么?

预先感谢您。

此外,:所以,问题是在注册页面说的密码是什么和登录页面上的选择查询试图匹配。

举例:注册密码:5586ef3ede51ef5b41676801d6870574 - 登录密码:f90dacb09ffd1cbf4bdf13b3175da696

这意味着,加入盐和MD5之间的某个地方,我们正在不同的结果。

+0

如果您可以打印您的show create table登录输出,这将有所帮助。另外,select * from登录输出,至少有一行是可疑的。 – Geremy

+1

MD5不再是一个好主意 – 2014-02-07 02:59:52

+0

@Geremy表\t创建表\t 登录\t CREATE TABLE'login'( 'id' INT(4)NOT NULL AUTO_INCREMENT, 'FirstName'文字NOT NULL, 'LastName'文本NOT NULL, 'username' varchar(32)NOT NULL, 'password' varchar(64)NOT NULL, 'salt' varchar(12)NOT NULL, 'Activation' varchar(40)DEFAULT NULL, PRIMARY KEY ('id'), UNIQUE KEY'username'('username'), UNIQUE KEY' id'('id') )ENGINE = MyISAM AUTO_INCREMENT = 27 DEFAULT CHARSET = latin1 – Dm3k1

回答

0

你确定这条线路正常工作吗?

$InsertQuery = "INSERT INTO login (firstname, lastname, username, password, salt, activation) VALUES ('$fnamePost', '$lnamePost', '$usernamePost', MD5('$salt$passwordPost'), '$salt','1')";

因为你把MD5函数为一个字符串。我不认为它会解决你的问题,但你尝试过类似

$variable = md5($salt$passwordPost)然后在查询中插入$variable

+0

因为OP将'$ InsertQuery'的内容放在双引号中,所以变量'$ salt'和'$ passwordPost'在'MD5()'调用连接之前被正确扩展。 – Sutandiono

+0

@ user3260711是的,它将$ salt和$ passwordPost连接到一个MD5中。问题是我的独特盐是否基于预定义的uniqid()函数存储为$ salt,这是基于时间的,当它存储到表中作为“salt”它已更改值时?我对事物工作原理的理解是,一旦查询开始,$ salt已被定义,因此这应该是不可能的? – Dm3k1

+0

我应该添加,如果我手动将pw更改为PhpMyAdmin中的MD5(密码),并从选择查询中删除$ saltPass前缀,我不会造成任何问题。 – Dm3k1

0

答案是我把盐限制在桌子上的12个字符,但指定的时间更长。因此,密码字段是盐的较长版本和用户输入的密码之间的连接,但盐只是唯一ID的前12个字符。

谢谢你的帮助。