In letzter Zeit versuche ich, meine eigene Sicherheit in ein Anmeldeskript zu implementieren, über das ich im Internet gestolpert bin. Nachdem ich Schwierigkeiten hatte zu lernen, wie ich mein eigenes Skript erstellen kann, um Salt für jeden Benutzer zu generieren, bin ich auf password_hash
gesto?en.
Soweit ich wei? (basierend auf der Lektüre dieser Seite), entsteht bei der Verwendung von password_hash
bereits Salz in der Leitung. Das ist echt?
Meine andere Frage ist, w?re es nicht klug, zwei Salzsorten zu haben? Eine direkt in der Datei und eine in der Datenbank? Wenn also jemand das Salt in der Datenbank besch?digt, k?nnen Sie das Salt trotzdem direkt in der Datei speichern? Ich habe hier gelesen, dass das Aufbewahren von Salz niemals eine kluge Idee ist, aber es verwirrt mich immer, was die Leute damit meinen.
是的,您理解正確,函數(shù)password_hash()將自行生成鹽,并將其包含在生成的哈希值中。將鹽存儲在數(shù)據(jù)庫中是絕對正確的,即使已知它也能完成其工作。
// 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);
您提到的第二個鹽(存儲在文件中的鹽)實際上是胡椒或服務(wù)器端密鑰。如果你在散列之前添加它(就像鹽一樣),那么你就添加了胡椒粉。不過,有一種更好的方法,您可以首先計算哈希值,然后使用服務(wù)器端密鑰加密(雙向)哈希值。這使您可以在必要時更改密鑰。
與鹽相反,這個密鑰應(yīng)該保密。人們經(jīng)?;煜⒃噲D隱藏鹽,但最好讓鹽發(fā)揮其作用并用密鑰添加秘密。
建議使用password_hash
來存儲密碼。不要將它們分成數(shù)據(jù)庫和文件。
假設(shè)我們有以下輸入:
$password = $_POST['password'];
您首先通過執(zhí)行以下操作對密碼進行哈希處理:
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
然后查看輸出:
var_dump($hashed_password);
正如你所看到的,它是經(jīng)過哈希處理的。 (我假設(shè)您執(zhí)行了這些步驟)。
現(xiàn)在,您將此散列密碼存儲在數(shù)據(jù)庫中,確保您的密碼列足夠大以容納散列值(至少 60 個字符或更長)。當(dāng)用戶要求登錄時,您可以使用數(shù)據(jù)庫中的哈希值檢查輸入的密碼,方法如下:
// 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.