2014-11-23 35 views
-1

我有一個問題得到的密碼被存儲在MySQL中以匹配登錄密碼使用salt。PHP/MYSQLi問題使用鹽密碼驗證

這裏是我的密碼生成代碼:

 $hash = hash('sha256', $password); 

     function createSalt() 
     { 
     $text = md5(uniqid(rand(), true)); 
      return substr($text, 0, 3); 
     } 

     $salt = createSalt(); 
     $password = hash('sha256', $salt . $hash); 

這裏是我的登錄頁面代碼:

 $userData = $result->fetch_array(MYSQL_ASSOC); 

     $hash = hash('sha256', $password); 

     $password = hash('sha256', $userData['salt'] . $hash); 

     //$hash = hash('sha256', $userData['salt'] . hash('sha256', $password)); 

     if($password != $userData['Password']) // Incorrect password. So, redirect to login_form again. 

有沒有錯誤,創造了MySQL的密碼(字段填充與即0d02a88c1e1057a64df6b3fed4c6ad64e228313b803e9f9b36 ...

雖然登錄創建類似:51839f9a15dac1f26825f4cd5d2ecf7ae83ea88d440415b04fb6ae41c3a0566f

只是不確定問題出在哪裏。在此先感謝,我對PHP很陌生。

+0

你不能這樣做slapdash。發佈類似於你的代碼的東西沒有幫助。您的第一步應該是驗證數據庫中的哈希密碼與您的預期結果相符。然後確認您的流程中的每一步都符合您的期望。 – 2014-11-23 18:59:14

+0

你不是總是使用不同的鹽來創建密碼嗎?這是一個問題。另一個你可能不會把'salt'信息放到'$ userData' – 2014-11-23 19:02:36

+0

@mike W什麼是slapdash?很明顯,我給出的例子是我的mysql數據庫中的EXACT,以及登錄頁面創建的內容。但是,如果我說這些是我的結果,那麼你應該把一些像「好的,每個用戶都不能得到相同的結果」這樣的居高臨下的東西放在一起。而且我已經根據我對PHP的理解儘可能地追蹤了它。感謝您非常不尋常的評論。 – 86Tango 2014-11-23 19:07:59

回答

0

首先,您在這裏有一些令人困惑的變量命名 - 您使用$ password來表示明文密碼和salt-and-hated表示。這使得閱讀代碼變得更加困難。

其次,讓我們來看看你的代碼作爲一系列狀態找到他們可能是想錯了:

  1. 輸入密碼。在兩種情況下都傳遞相同的字符串嗎?你注意空白和大小寫嗎?使用調試器來驗證。如果明文密碼不是逐字節相同的,那麼最初的sha256散列應該在這一點上顯示出不同。
  2. 鹽的生成/檢索。你是否保存/檢索完全相同的鹽,字節爲單位?再次,注意空格/大寫,並檢查數據庫是否沒有自動截斷或者更改字符串的編碼。
  3. 比較串聯後的字符串,但在第二個sha256散列操作之前。根據定義,由於最終輸出不同,因此您的明文密碼或鹽不是字節對字節相同。這可以幫助你判斷一個或兩個是否是罪魁禍首。
+0

謝謝。我會馬上看看這些事情並回復。謝謝 – 86Tango 2014-11-23 19:19:48

0

通過功能password_hash(),讓您的生活變得更加輕鬆,您的密碼更安全。

SHA- *算法不適合哈希密碼,因爲它們的速度太快。函數password_hash()不僅可以計算出更適合的BCrypt哈希,還可以處理安全salt的生成,並且不必在單獨的數據庫字段中存儲/檢索鹽(它將成爲部分的結果散列值)。

// Hash a new password for storing in the database. 
// The function automatically generates a cryptographically safe salt. 
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT); 

// Check if the hash of the entered login password, matches the stored hash. 
// The salt and the cost factor will be extracted from $existingHashFromDb. 
$isPasswordCorrect = password_verify($password, $existingHashFromDb);