首頁  >  問答  >  主體

如何使用PHP的password_hash函數對密碼進行雜湊和驗證

<p>最近我一直在嘗試在網路上找到的登入腳本上實現自己的安全性。在努力學習如何為每個使用者產生鹽的腳本時,我偶然發現了<code>password_hash</code>。 </p> <p>根據我理解(基於這個頁面上的閱讀),當你使用<code>password_hash</code>時,鹽已經在行中生成了。這是真的嗎? </p> <p>我還有一個問題,是否明智地使用兩個鹽?一個直接存在文件中,一個存在資料庫中?這樣,如果有人破壞了資料庫中的鹽,你仍然有文件中的一個鹽。我在這裡讀到過,儲存鹽從來都不是一個明智的做法,但是人們說這個總是讓我感到困惑。 </p>
P粉011684326P粉011684326453 天前621

全部回覆(2)我來回復

  • P粉896751037

    P粉8967510372023-08-18 17:37:32

    是的,你理解得沒錯,函數password_hash()會自動產生一個鹽,並將其包含在產生的雜湊值中。將鹽儲存在資料庫中是完全正確的,即使已知,它也能發揮作用。

    // 为在数据库中存储的新密码生成哈希值。
    // 该函数会自动生成一个密码学安全的盐。
    $hashToStoreInDb = password_hash($_POST['password'], PASSWORD_DEFAULT);
    
    // 检查输入的登录密码的哈希值是否与存储的哈希值匹配。
    // 盐和成本因素将从$existingHashFromDb中提取。
    $isPasswordCorrect = password_verify($_POST['password'], $existingHashFromDb);

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

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

    回覆
    0
  • P粉422227023

    P粉4222270232023-08-18 10:36:51

    使用password_hash是儲存密碼的推薦方式。不要將它們分開儲存在資料庫和文件中。

    假設我們有以下輸入:

    $password = $_POST['password'];

    首先透過以下方式對密碼進行雜湊處理:

    $hashed_password = password_hash($password, PASSWORD_DEFAULT);

    然後查看輸出結果:

    var_dump($hashed_password);

    如你所見,它已經被哈希處理了。 (我假設你已經完成了這些步驟)。

    現在將這個雜湊密碼儲存在你的資料庫中,確保你的密碼列足夠大以容納雜湊值(至少60個字元或更長)。當使用者要求登入時,你可以透過以下方式檢查資料庫中的雜湊值與密碼輸入是否匹配:

    // 查询数据库获取用户名和密码
    // ...
    
    if(password_verify($password, $hashed_password)) {
        // 如果密码输入与数据库中的哈希密码匹配
        // 做一些操作,你懂的... 登录他们。
    } 
    
    // 否则,将他们重定向回登录页面。

    官方參考文件

    #

    回覆
    0
  • 取消回覆