簡體   English   中英

從數據庫驗證鹽

[英]Verifying Salt from Database

我在學校(初學者)中建立了一個登錄/注冊項目,我有點卡住了。 當用戶注冊時,我設法對其進行了鹽灌。 但是,當我想用​​哈希/鹽驗證他們的登錄信息時,似乎無法將其刪除。

我的注冊碼是:

 $localhost="host";
 $user="user";
 $password="password";
 $database="database";
 $email =$_POST['email'];
 $passwords =$_POST['passwords'];

 $conn =new mysqli($localhost, $user, $password, $database);
 $error =$conn->connect_error;
 if($error){
    $code = $conn->connect_errno;
    die("Error: ($code) $error");
  }

  $email = mysqli_real_escape_string($conn, $_POST['email']);
  $passwordFromPost = $_POST['passwords'];
  $salt = password_hash($passwordFromPost, PASSWORD_BCRYPT);
  $passwords = mysqli_real_escape_string($conn, $_POST['passwords']);


  $sql = "INSERT INTO Users (email, passwords, salt) 
  VALUES('$email','$passwords','$salt')";
  $result= $conn->query($sql);


  $conn->close();

我在這里的另一篇文章中讀到了一些有關它的內容,我認為我應該可以使用$passwordCorrect = password_verify("password", $hashPassword);來解密$passwordCorrect = password_verify("password", $hashPassword);

但我不確定如何在php代碼中實現它,並使其驗證用戶。 關於下一步應該做什么的任何提示?

您並不是真正在創建鹽, 它是作為hash的一部分包含的 ,您可以使用password_hash()函數來驗證密碼。 您永遠不會使用此功能解密密碼,而只是驗證哈希是正確的。

這行$salt = password_hash($passwordFromPost, PASSWORD_BCRYPT); 實際上並沒有創建鹽-它創建了密碼哈希。

您正確地使用了以下函數:

$passwordCorrect = password_verify("password", $hashPassword);

如果驗證$passwordCorrect$passwordCorrect將為true 如果不是, false

if($passwordCorrect) {
    // allow login
} else {
    // do not allow login
}

在您的代碼中,您可以刪除一些行並更改為:

$email = mysqli_real_escape_string($conn, $_POST['email']);
$passwordFromPost = $_POST['passwords'];
$password = password_hash($passwordFromPost, PASSWORD_BCRYPT);

現在,您只需要存儲密碼和電子郵件即可,沒有其他數據。

現在,查詢數據庫:

$stmt = $conn->prepare('SELECT * FROM Users WHERE email = ?');
$stmt->bind_param("s", $_POST['email']);
$result = $stmt->execute();

現在,用戶密碼位於結果數組中,並且可以與$_POST['password']

如果您使用的PHP版本低於5.5,則可以使用password_hash() 兼容性包 在散列之前, 不必逃避密碼密碼使用任何其他清除機制。 這樣做會更改密碼,並導致不必要的附加編碼。

另外: Little Bobby您的腳本有遭受SQL注入攻擊的危險。 了解有關MySQLi的 准備好的語句。 即使轉義字符串也不安全!

首先使用准備好的語句,而不是查詢中的實際轉義字符串,以便從一開始就習慣最佳實踐。

您不應該存儲密碼,僅存儲密碼的哈希值。 所以改變
$salt = password_hash($passwordFromPost, PASSWORD_BCRYPT);

$password = password_hash($passwordFromPost, PASSWORD_BCRYPT);

並且僅存儲電子郵件和哈希密碼。 然后在檢查登錄名時,選擇密碼,其中email =提供的電子郵件,並使用password_verify('password from login','password from db'from'從數據庫中選擇的密碼'),如果密碼匹配,則結果為true。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM