我遇到問題。從數據庫中檢索鹽值時,我的哈希密碼值不匹配。從數據庫檢索鹽值時,我的散列密碼值不匹配
Register.php
- 用戶輸入用戶名和密碼。
- 通過POST收集用戶名和密碼。
- 生成隨機鹽值將鹽值添加到密碼值(由用戶輸入)的末尾 。並散列完整值。
插入用戶名,鹽,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
- 用戶輸入用戶名和密碼。
- 通過POST收集用戶名和密碼。
- 檢查數據庫中是否存在用戶名。
- 從數據庫中獲取該用戶名的salt值,並將其添加到用戶在登錄表單中輸入的密碼末尾。將該值散列並存儲到$ _SESSION [「newHashedValue」]變量中(用於測試)
- 從數據庫中檢索原始hashedValue,並將其存儲在$ _SESSION [「dbHashedValue」]中並比較值。
如果這些值匹配,那麼我們知道登錄密碼是正確的。 問題:這些值不匹配,他們應該因爲即時輸入相同的登錄細節。
如果(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; }
}
這應該是不可能的。你能否檢查一下列'hashedPassword'和'salt'是否足夠長以存儲你的信息?也許你的鹽或散列正在被切斷一點,這會毀了一切。請記住,salt的長度應該是2048而不是1024. – aron9forever
你的數據庫列是如何設置的?有足夠的空間存儲完整的散列嗎? – Gavin
只需使用['password_hash'](https://secure.php.net/manual/en/function.password-hash.php)和['password_verify'](https://secure.php.net/manual/) EN/function.password-verify.php)。 –