2014-02-07 63 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個字符。

謝謝你的幫助。