Heim > Fragen und Antworten > Hauptteil
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.
P粉5205457532023-10-14 20:22:40
是的,您理解正确,函数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);
您提到的第二个盐(存储在文件中的盐)实际上是胡椒或服务器端密钥。如果你在散列之前添加它(就像盐一样),那么你就添加了胡椒粉。不过,有一种更好的方法,您可以首先计算哈希值,然后使用服务器端密钥加密(双向)哈希值。这使您可以在必要时更改密钥。
与盐相反,这个密钥应该保密。人们经常混淆它并试图隐藏盐,但最好让盐发挥其作用并用密钥添加秘密。
P粉3109311982023-10-14 09:42:05
建议使用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.