如何在資料庫驗證中區分加鹽密碼和純密碼
在資料庫驗證中,保護密碼至關重要。一種流行的技術涉及使用加鹽密碼,其中在散列之前將隨機字串(鹽)附加到密碼中。這使得破解密碼的難度呈指數級增長,從而增強了安全性。
挑戰:驗證會員登入
在使用儲存在MySQL 中的加鹽密碼實現會員網站時,常見的一個問題是:登入認證過程中出現錯誤。登入嘗試似乎錯誤地繞過了密碼檢查,從而允許未經授權的訪問該網站。
檢查問題代碼
以下程式碼片段用於驗證會員登入:
$name = mysqli_real_escape_string($connect, $_POST['name']); $password = mysqli_real_escape_string($connect, $_POST['password']); $saltQuery = "SELECT salt FROM users WHERE name = '$name';"; $result = mysqli_query($connect, $saltQuery); if ($result === false){ die(mysqli_error()); } $row = mysqli_fetch_assoc($result); $salt = $row['salt']; $saltedPW = $password . $salt; $hashedPW = hash('sha256', $saltedPW); $sqlQuery = "SELECT * FROM users WHERE name = '$name' AND password = '$hashedPW'"; if (mysqli_query($connect, $sqlQuery)){ echo '<h1>Welcome to the member site '.$name.'</h1>'; } else { echo 'error adding the query: '.$sql_q.'<br> Reason: '.mysqli_error($connect); }
解決方案:正確的密碼驗證
問題是由於在SQL 查詢中使用直接密碼比較而引起的。由於儲存的密碼經過加鹽處理,因此此方法會將所有登入嘗試誤解為有效。為了修正這個問題,我們需要執行以下步驟:
使用 mysqli 的範例程式碼:
// Connect to the database $mysqli = new mysqli($servername, $username, $password, $dbname); // Initialize variables $username = mysqli_real_escape_string($mysqli, $_POST['username']); $password = mysqli_real_escape_string($mysqli, $_POST['password']); // Fetch the salted hash for the specified username $query = "SELECT password FROM users WHERE username = ?"; $stmt = $mysqli->prepare($query); $stmt->bind_param('s', $username); $stmt->execute(); $stmt->bind_result($hashedPassword); $stmt->fetch(); // Verify the entered password if (password_verify($password, $hashedPassword)) { // Login successful echo '<h1>Welcome to the member site '.$username.'</h1>'; } else { // Password did not match echo 'Invalid login credentials'; }
以上是為什麼即使使用加鹽密碼,我的會員網站也會繞過密碼檢查?的詳細內容。更多資訊請關注PHP中文網其他相關文章!