84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
最近我一直在嘗試在網路上找到的登入腳本上實現自己的安全性。在努力學習如何為每個使用者產生鹽的過程中,我偶然發現了password_hash。
password_hash
據我所了解(根據這個頁面上的閱讀),在使用password_hash時,鹽已經在行中生成。這是真的嗎?
我還有一個問題,是否明智地使用兩個鹽?一個直接在檔案中,一個在資料庫中?這樣,如果有人破解了資料庫中的鹽,你仍然有檔案中的那個鹽。我在這裡讀到過儲存鹽從來都不是一個明智的想法,但是我一直對人們所說的這個意思感到困惑。
是的,你理解得沒錯,函數password_hash()會自動產生一個鹽,並將其包含在產生的雜湊值中。將鹽儲存在資料庫中是完全正確的,即使已知也能發揮作用。
// 为在数据库中存储的新密码生成哈希值。 // 该函数会自动生成一个密码学安全的盐。 $hashToStoreInDb = password_hash($_POST['password'], PASSWORD_DEFAULT); // 检查输入的登录密码的哈希值是否与存储的哈希值匹配。 // 盐和成本因素将从$existingHashFromDb中提取。 $isPasswordCorrect = password_verify($_POST['password'], $existingHashFromDb);
你提到的第二個鹽(儲存在檔案中的鹽)實際上是一種「胡椒粉」或伺服器端密鑰。如果在哈希之前添加它(就像鹽一樣),那麼你就添加了一種胡椒粉。不過,有一種更好的方法,你可以先計算雜湊值,然後使用伺服器端金鑰加密(雙向加密)雜湊。這樣你就可以在必要時更改密鑰。
與鹽不同,這個密鑰應該保密。人們經常混淆並試圖隱藏鹽,但最好讓鹽發揮作用,並使用密鑰添加秘密。
使用password_hash是儲存密碼的推薦方式。不要將它們分開儲存到資料庫和文件中。
假設我們有以下輸入:
$password = $_POST['password'];
首先透過以下方式對密碼進行雜湊處理:
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
然後查看輸出結果:
var_dump($hashed_password);
可以看到它已經被哈希處理了(我假設你已經完成了這些步驟)。
現在將這個雜湊密碼儲存到資料庫中,確保你的密碼列足夠大以容納雜湊值(至少60個字元或更長)。當使用者要求登入時,你可以透過以下方式檢查資料庫中的雜湊值與密碼輸入是否匹配:
// 查询数据库以获取用户名和密码 // ... if(password_verify($password, $hashed_password)) { // 如果密码输入与数据库中的哈希密码匹配 // 做一些操作,你懂的...登录他们。 } // 否则,将他们重定向回登录页面。
官方參考
是的,你理解得沒錯,函數password_hash()會自動產生一個鹽,並將其包含在產生的雜湊值中。將鹽儲存在資料庫中是完全正確的,即使已知也能發揮作用。
你提到的第二個鹽(儲存在檔案中的鹽)實際上是一種「胡椒粉」或伺服器端密鑰。如果在哈希之前添加它(就像鹽一樣),那麼你就添加了一種胡椒粉。不過,有一種更好的方法,你可以先計算雜湊值,然後使用伺服器端金鑰加密(雙向加密)雜湊。這樣你就可以在必要時更改密鑰。
與鹽不同,這個密鑰應該保密。人們經常混淆並試圖隱藏鹽,但最好讓鹽發揮作用,並使用密鑰添加秘密。
使用
password_hash
是儲存密碼的推薦方式。不要將它們分開儲存到資料庫和文件中。假設我們有以下輸入:
首先透過以下方式對密碼進行雜湊處理:
然後查看輸出結果:
可以看到它已經被哈希處理了(我假設你已經完成了這些步驟)。
現在將這個雜湊密碼儲存到資料庫中,確保你的密碼列足夠大以容納雜湊值(至少60個字元或更長)。當使用者要求登入時,你可以透過以下方式檢查資料庫中的雜湊值與密碼輸入是否匹配:
官方參考