2016-02-26 72 views
0

我遇到問題。從數據庫中檢索鹽值時,我的哈希密碼值不匹配。從數據庫檢索鹽值時,我的散列密碼值不匹配

Register.php

  1. 用戶輸入用戶名和密碼。
  2. 通過POST收集用戶名和密碼。
  3. 生成隨機鹽值將鹽值添加到密碼值(由用戶輸入)的末尾 。並散列完整值。
  4. 插入用戶名,鹽,hashedpassword和原始密碼到 數據庫(只是用於測試)

    if (isset($_POST["usernameReg"]) && isset($_POST["passwordReg"])){ 
    // filter everything but numbers and letters 
    $username = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["usernameReg"]); 
    $password = preg_replace('#[^A-Za-z0-9]#i', '', $_POST["passwordReg"]); 
    
    $salt = openssl_random_pseudo_bytes(1024); 
    
    $hashedPassword = hash('sha256', $password.$salt); 
    //$hashedPassword1 = hash('sha256', $password); 
    
    $query = "INSERT INTO users (username, salt, hashedPassword, password) VALUES (:username, :salt, :hashedPassword, :password)"; 
    
    $statement = $pdoConnection->prepare($query); 
    $statement->bindValue(':username', $username, PDO::PARAM_STR); 
    $statement->bindValue(':salt', $salt, PDO::PARAM_STR); 
    $statement->bindValue(':hashedPassword', $hashedPassword, PDO::PARAM_STR); 
    $statement->bindValue(':password', $password, PDO::PARAM_STR); 
    $statement->execute(); 
    

    }

的login.php

  1. 用戶輸入用戶名和密碼。
  2. 通過POST收集用戶名和密碼。
  3. 檢查數據庫中是否存在用戶名。
  4. 從數據庫中獲取該用戶名的salt值,並將其添加到用戶在登錄表單中輸入的密碼末尾。將該值散列並存儲到$ _SESSION [「newHashedValue」]變量中(用於測試)
  5. 從數據庫中檢索原始hashedValue,並將其存儲在$ _SESSION [「dbHashedValue」]中並比較值。
  6. 如果這些值匹配,那麼我們知道登錄密碼是正確的。 問題:這些值不匹配,他們應該因爲即時輸入相同的登錄細節。

    如果(isset($ _ POST [ 「用戶名」])& & isset($ _ POST [ 「密碼」])){$ 用戶名= preg_replace函數('#[^ A-ZA-Z0-9] #i中','',$ _POST [「username」]); $ password = preg_replace('#[^ A-Za-z0-9] #i','',$ _POST [「password」]);

    //check if this username and password exist in our database and are therefore valid 
        $query = "SELECT * FROM users WHERE username=:username LIMIT 1"; 
    
        $statement = $pdoConnection->prepare($query); 
        $statement->bindValue(':username', $username, PDO::PARAM_STR); 
        $statement->execute(); 
        $statement->setFetchMode(PDO::FETCH_ASSOC); 
    
        while($row = $statement->fetch()){ 
         $saltPassword = $password.$row["salt"]; 
         $newHashedValue = hash('sha256', $saltPassword); 
         $dbHashedValue = $row["hashedPassword"]; 
         //these two values are not matching but they should match 
         $_SESSION["newHashedValue"] = $newHashedValue; 
         $_SESSION["dbHashedValue"] = $dbHashedValue; 
        } 
    

    }

stored in database

+0

這應該是不可能的。你能否檢查一下列'hashedPassword'和'salt'是否足夠長以存儲你的信息?也許你的鹽或散列正在被切斷一點,這會毀了一切。請記住,salt的長度應該是2048而不是1024. – aron9forever

+0

你的數據庫列是如何設置的?有足夠的空間存儲完整的散列嗎? – Gavin

+1

只需使用['password_hash'](https://secure.php.net/manual/en/function.password-hash.php)和['password_verify'](https://secure.php.net/manual/) EN/function.password-verify.php)。 –

回答

2
$salt = openssl_random_pseudo_bytes(1024); //will generate 2048 chars since a character is half a byte. 

將產生2048個字符的字符串。因此,解決方案是要麼將salt列的大小增加到2048,這有點矯枉過正,要麼產生32個字節,這將是64個字符。上這裏http://php.net/manual/en/function.openssl-random-pseudo-bytes.php

的SHA256散列是長度爲64的這樣hashedPassword列應是長度爲64的功能

$salt = openssl_random_pseudo_bytes(32); //will generate 64 chars 

更多信息(顧名思義,256位= 32字節= 64個字符)

+0

像一個魅力一樣工作。謝謝 – Sarah