Wie werden Kennwörter sicher gehasht?

Reicht es aus, wenn ich Passwörter vor der Speicherung in meiner Datenbank mit einem Hashwert versehe, um zu verhindern, dass sie von jemandem wiederhergestellt werden können?

Ich sollte darauf hinweisen, dass sich dies nur auf den Abruf direkt aus der Datenbank bezieht und nicht auf andere Arten von Angriffen, wie z. B. Bruteforcing der Anmeldeseite der Anwendung, Keylogger auf dem Client und natürlich [Gummihosen-Kryptoanalyse] (https://xkcd.com/538/) (oder heutzutage sollte man es "Chocolate Cryptanalysis" nennen).

**Natürlich wird jede Form von Hash diese Angriffe nicht verhindern.

Passwörter, die in einer Datenbank als Hash-Werte gespeichert sind, können entweder durch Brute-Force-Berechnung der Hash-Werte oder durch Verwendung von Rainbow-Tabellen (die für den verwendeten Algorithmus spezifisch sind) wiederhergestellt werden.

Eine Rainbow-Tabelle wird als eine Reihe von vorberechneten Werten entweder für eine Wörterbuchdatei oder häufiger für jede Kombination eines bestimmten Zeichensatzes [a-z, A-Z, 0-9] erstellt, was ein gängiges Beispiel ist.

Im Wesentlichen können sie das Knacken eines Kennworts beschleunigen, da der Hash-Wert in der Tabelle nachgeschlagen werden kann, anstatt dass der Angreifer den Hash-Wert für jedes Kennwort erstellen muss. Regenbogentabellen für gängige Kennwortalgorithmen (z. B. NTLM, MD5 usw.) sind im Internet zu finden, so dass es relativ einfach ist, Zugang zu großen Mengen dieser Tabellen zu erhalten.

Es gibt eine Reihe von Möglichkeiten, die Sicherheit der in der Datenbank gespeicherten Hashes zu verbessern.

Die erste Möglichkeit ist die Verwendung eines Salt-Wertes pro Benutzer, der zusammen mit dem gehashten Passwort in der Datenbank gespeichert wird. Er soll nicht geheim sein, sondern wird verwendet, um den Brute-Force-Prozess zu verlangsamen und die Verwendung von Regenbogentabellen unpraktisch zu machen.

Ein weiterer Zusatz, den ich gesehen habe, ist ein so genannter Pfefferwert. Dabei handelt es sich um eine weitere zufällige Zeichenkette, die für alle Benutzer gleich ist und mit dem Anwendungscode und nicht in der Datenbank gespeichert wird. Die Theorie ist, dass unter bestimmten Umständen die Datenbank kompromittiert sein kann, der Anwendungscode jedoch nicht, und in diesen Fällen könnte dies die Sicherheit verbessern. Dies führt jedoch zu Problemen, wenn mehrere Anwendungen dieselbe Kennwortdatenbank verwenden.

Eine dritte Möglichkeit, die Sicherheit von Kennwörtern zu verbessern, ist die Verwendung einer langsamen Kennwortfunktion, die keine großen Auswirkungen auf einzelne Benutzer hat, aber einen Angreifer beim Knacken von Kennwörtern, die aus der Datenbank abgerufen werden, massiv behindert. Weitere Informationen zu diesem Ansatz finden Sie hier.

Kommentare (0)

Passwörter müssen immer gehasht werden, was aber nicht bedeutet, dass es keine Möglichkeit für Brute-Force-Angriffe gibt. Es sollten zusätzliche Maßnahmen zur Speicherung und Verwaltung von Benutzerpasswörtern ergriffen werden. Ich empfehle diesen Artikel von Solar Designer zu diesem Thema: http://php-security.org/2010/05/26/mops-submission-10-how-to-manage-a-php-applications-users-and-passwords/index.html.

Kommentare (1)

Je nachdem, welchen Algorithmus Sie verwenden, lautet die Antwort wahrscheinlich nein.

Zunächst einmal sollten Sie sie salzen, was im Grunde bedeutet, dass Sie einen Text an das Kennwort anhängen oder ihm voranstellen.

Dann sollten Sie einen starken Algorithmus verwenden (md5 reicht nicht aus)

Kommentare (8)