Kürzlich habe ich versucht, meine eigene Sicherheit in einem Anmeldeskript zu implementieren, auf das ich im Internet gestoßen bin. Nachdem ich versucht hatte zu lernen, wie ich mein eigenes Skript erstellen kann, um für jeden Benutzer ein Salt zu generieren, bin ich darauf gestoßen password_hash
.
Soweit ich weiß (basierend auf den Angaben auf dieser Seite ), wird bei der Verwendung bereits Salz in der Zeile generiert password_hash
. Ist das wahr?
Eine andere Frage, die ich hatte, war, wäre es nicht klug, zwei Salze zu haben? Eine direkt in der Datei und eine in der DB? Auf diese Weise haben Sie immer noch das Salz direkt in der Datei, wenn jemand Ihr Salz in der Datenbank kompromittiert? Ich habe hier weiter gelesen, dass das Lagern von Salzen niemals eine kluge Idee ist, aber es hat mich immer verwirrt, was die Leute damit gemeint haben.
quelle
Antworten:
Die Verwendung
password_hash
ist die empfohlene Methode zum Speichern von Kennwörtern. Trennen Sie sie nicht in DB und Dateien.Nehmen wir an, wir haben folgenden Input:
Sie hashen zuerst das Passwort, indem Sie dies tun:
Dann sehen Sie die Ausgabe:
Wie Sie sehen können, ist es gehasht. (Ich nehme an, Sie haben diese Schritte ausgeführt).
Jetzt speichern Sie dieses Hash-Passwort in Ihrer Datenbank und stellen sicher , dass Ihre Passwortspalte groß genug ist, um den Hash-Wert zu speichern (mindestens 60 Zeichen oder länger) . Wenn ein Benutzer nach einer Anmeldung fragt, überprüfen Sie die Kennworteingabe mit diesem Hashwert in der Datenbank folgendermaßen:
Offizielle Referenz
quelle
Ja, Sie haben es richtig verstanden. Die Funktion password_hash () generiert selbst ein Salt und nimmt es in den resultierenden Hash-Wert auf. Das Speichern des Salzes in der Datenbank ist absolut korrekt, es macht seine Arbeit, auch wenn es bekannt ist.
Das zweite Salz, das Sie erwähnt haben (das in einer Datei gespeichert ist), ist tatsächlich ein Pfeffer oder ein serverseitiger Schlüssel. Wenn Sie es vor dem Hashing hinzufügen (wie das Salz), fügen Sie einen Pfeffer hinzu. Es gibt jedoch einen besseren Weg, Sie könnten zuerst den Hash berechnen und anschließend den Hash mit einem serverseitigen Schlüssel verschlüsseln (in beide Richtungen). Dies gibt Ihnen die Möglichkeit, den Schlüssel bei Bedarf zu ändern.
Im Gegensatz zum Salz sollte dieser Schlüssel geheim gehalten werden. Die Leute mischen es oft durch und versuchen, das Salz zu verstecken, aber es ist besser, das Salz seinen Job machen zu lassen und das Geheimnis mit einem Schlüssel hinzuzufügen.
quelle
Ja, es ist wahr. Warum bezweifeln Sie die PHP-FAQ zur Funktion? :) :)
Das Ergebnis des Laufens
password_hash()
besteht aus vier Teilen:Wie Sie sehen können, ist der Hash ein Teil davon.
Sicher, Sie könnten ein zusätzliches Salz für eine zusätzliche Sicherheitsebene haben, aber ich denke ehrlich, dass dies in einer regulären PHP-Anwendung übertrieben ist. Der Standard-bcrypt-Algorithmus ist gut, und der optionale Blowfish-Algorithmus ist wohl noch besser.
quelle
Verwenden Sie niemals md5 (), um Ihr Passwort zu sichern, auch mit Salz, es ist immer gefährlich !!
Stellen Sie sicher, dass Ihr Passwort mit den neuesten Hashing-Algorithmen wie folgt gesichert ist.
Verwenden Sie die folgende Funktion, um das verschlüsselte Kennwort der Datenbank und das vom Benutzer eingegebene Kennwort abzugleichen.
Wenn Sie Ihr eigenes Salz verwenden möchten, verwenden Sie Ihre benutzerdefinierte Funktion für dasselbe. Befolgen Sie einfach die nachstehenden Anweisungen. Ich empfehle dies jedoch nicht, da es in den neuesten Versionen von PHP als veraltet eingestuft wird.
Lesen Sie mehr über password_hash (), bevor Sie den folgenden Code verwenden.
quelle
Es gibt einen deutlichen Mangel an Diskussionen über die Abwärts- und Vorwärtskompatibilität, die in die Passwortfunktionen von PHP integriert ist. Vor allem:
crypt()
und von Natur aus abwärtskompatibel mitcrypt()
-format-Hashes, selbst wenn sie veraltete und / oder unsichere Hash-Algorithmen verwenden.password_needs_rehash()
und ein wenig Logik in Ihren Authentifizierungsworkflow können Sie Ihre Hashes mit aktuellen und zukünftigen Algorithmen auf dem neuesten Stand halten, ohne dass zukünftige Änderungen am Workflow erforderlich sind. Hinweis: Alle Zeichenfolgen, die nicht mit dem angegebenen Algorithmus übereinstimmen, werden für eine erneute Aufbereitung gekennzeichnet, einschließlich nicht kryptakompatibler Hashes.Z.B:
Ausgabe:
Als letzte Anmerkung, da Sie das Kennwort eines Benutzers nur beim Anmelden erneut hashen können, sollten Sie unsichere Legacy-Hashes als "Sonnenuntergang" betrachten, um Ihre Benutzer zu schützen. Damit meine ich, dass Sie nach einer bestimmten Nachfrist alle unsicheren [z. B. nackten MD5 / SHA / ansonsten schwachen] Hashes entfernen und Ihre Benutzer sich auf die Kennwortrücksetzmechanismen Ihrer Anwendung verlassen.
quelle
Klassenkennwort vollständiger Code:
quelle
Ich habe eine Funktion erstellt, die ich ständig zur Kennwortüberprüfung und zum Erstellen von Kennwörtern verwende, z. B. um sie in einer MySQL-Datenbank zu speichern. Es wird ein zufällig erzeugtes Salz verwendet, das viel sicherer ist als die Verwendung eines statischen Salzes.
quelle
salt
Parameter wegzulassen . Er wird automatisch von der Funktion password_hash () gemäß den Best Practices generiert . StattdessenPASSWORD_BCRYPT
kannPASSWORD_DEFAULT
man zukunftssicheren Code schreiben.