首頁  >  問答  >  主體

如何使用PHP的password_hash來雜湊和驗證密碼

<p>最近,我一直在嘗試在網路上偶然發現的登入腳本上實現自己的安全性。在努力學習如何製作自己的腳本來為每個用戶生成鹽之後,我偶然發現了 <code>password_hash</code>。 </p> <p>據我了解(基於本頁的閱讀),當您使用<code>password_hash</code>時,鹽已經在行中生成。這是真的? </p> <p>我的另一個問題是,有 2 種鹽不是明智的嗎?一種直接在文件中,一種在資料庫中?這樣,如果有人破壞了資料庫中的鹽,您仍然可以直接在文件中保存鹽嗎?我在這裡讀到,儲存鹽從來都不是一個聰明的主意,但它總是讓我困惑人們的意思。 </p>
P粉898107874P粉898107874446 天前429

全部回覆(2)我來回復

  • P粉555682718

    P粉5556827182023-08-25 00:55:35

    是的,您理解正確,函數password_hash()將自行產生鹽,並將其包含在產生的雜湊值中。將鹽儲存在資料庫中是絕對正確的,即使已知它也能完成其工作。

    // Hash a new password for storing in the database.
    // The function automatically generates a cryptographically safe salt.
    $hashToStoreInDb = password_hash($_POST['password'], PASSWORD_DEFAULT);
    
    // 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($_POST['password'], $existingHashFromDb);

    您提到的第二個鹽(儲存在檔案中的鹽)實際上是胡椒或伺服器端密鑰。如果你在散列之前添加它(就像鹽一樣),那麼你就添加了胡椒粉。不過,有一種更好的方法,您可以先計算雜湊值,然後使用伺服器端金鑰加密(雙向)雜湊值。這使您可以在必要時更改密鑰。

    與鹽相反,這個密鑰應該保密。人們經常混淆它並試圖隱藏鹽,但最好讓鹽發揮作用並用密鑰添加秘密。

    回覆
    0
  • P粉377412096

    P粉3774120962023-08-25 00:34:19

    建議使用password_hash來儲存密碼。不要將它們分成資料庫和檔案。

    假設我們有以下輸入:

    $password = $_POST['password'];

    您首先執行以下操作對密碼進行雜湊處理:

    $hashed_password = password_hash($password, PASSWORD_DEFAULT);

    然後查看輸出:

    var_dump($hashed_password);

    正如你所看到的,它是經過哈希處理的。 (我假設您執行了這些步驟)。

    現在,您將此雜湊密碼儲存在資料庫中,確保您的密碼列足夠大以容納雜湊值(至少 60 個字元或更長)。當使用者要求登入時,您可以使用資料庫中的雜湊值檢查輸入的密碼,方法如下:

    // Query the database for username and password
    // ...
    
    if(password_verify($password, $hashed_password)) {
        // If the password inputs matched the hashed password in the database
        // Do something, you know... log them in.
    } 
    
    // Else, Redirect them back to the login page.

    官方參考

    回覆
    0
  • 取消回覆