539 Stimmen

Bestes Verfahren zum Speichern von Passwörtern in der Datenbank

Ich arbeite an einem Projekt, bei dem eine Authentifizierung (Benutzername und Passwort) erforderlich ist.

Es stellt auch eine Verbindung zu einer Datenbank her, also dachte ich mir, dass ich den Benutzernamen und das Passwort dort speichern würde. Allerdings scheint es nicht so eine gute Idee zu haben, Passwörter als nur ein Textfeld in einer Tabelle sitzen auf der Datenbank.

Ich verwende C# und verbinde mich mit einem 2008 Express Server. Kann jemand vorschlagen (mit so vielen Beispielen wie möglich), was der beste Weg, um diese Art von Daten zu speichern sein würde?

P.S. Ich bin offen für die Idee, dass diese Informationen nicht in der Datenbank gespeichert werden, wenn ein guter Grund dafür angegeben werden kann.

474voto

Paolo Bergantino Punkte 465120

Sie haben recht, dass die Speicherung des Kennworts in einem Klartextfeld eine Schrecklich Idee. Wie auch immer, was den Standort betrifft In den meisten Fällen (und mir fallen ehrlich gesagt keine Gegenbeispiele ein) wird die Speicherung der Vertretung eines Kennworts in der Datenbank ist der richtige Weg. Mit Darstellung meine ich, dass Sie das Kennwort mit einem Salt (der für jeden Benutzer unterschiedlich sein sollte) und einem sicheren 1-Wege-Algorithmus hashen und speichern wollen dass und verwirft das ursprüngliche Passwort. Wenn Sie dann ein Kennwort überprüfen wollen, hacken Sie den Wert (mit demselben Hashing-Algorithmus und Salt) und vergleichen ihn mit dem gehashten Wert in der Datenbank.

Es ist zwar gut, dass Sie darüber nachdenken, und es ist eine gute Frage, aber es handelt sich eigentlich um eine Verdoppelung dieser Fragen (mindestens):

Die Gefahr beim einfachen Hashing eines Kennworts und dessen Speicherung besteht darin, dass ein Unbefugter, der sich Zugang zu Ihrer Datenbank verschafft, immer noch die so genannten "Salting"-Funktionen verwenden kann. Regenbogentische um das Kennwort "entschlüsseln" zu können (zumindest diejenigen, die in der Regenbogentabelle auftauchen). Um dies zu umgehen, fügen die Entwickler eine Salz zu Passwörtern, was, wenn es richtig gemacht wird, Regenbogenangriffe einfach unmöglich macht. Beachten Sie, dass es ein weit verbreiteter Irrglaube ist, allen Passwörtern einfach dieselbe eindeutige und lange Zeichenfolge hinzuzufügen; dies ist zwar nicht Schrecklich ist es am besten, jedem Kennwort eindeutige Salts hinzuzufügen. Lesen Sie dies für mehr.

68voto

joej Punkte 1083

Contexte Sie müssen nie ... wirklich ... das Passwort des Benutzers kennen. Sie wollen nur überprüfen, ob ein neuer Benutzer das Passwort für ein Konto kennt.

Hash It: Speichern Sie Benutzerpasswörter mit einer starken Hash-Funktion (Einwegverschlüsselung). Eine Suche nach "c# encrypt passwords" liefert eine Vielzahl von Beispielen.

Siehe die Online SHA1-Hash-Erstellung um eine Vorstellung davon zu bekommen, was eine Hash-Funktion erzeugt (verwenden Sie aber nicht SHA1 als Hash-Funktion, sondern etwas Stärkeres wie SHA256).

Ein gehashtes Kennwort bedeutet, dass Sie (und Datenbankdiebe) nicht in der Lage sein sollten, den Hash in das ursprüngliche Kennwort zurückzuverwandeln.

Wie man es benutzt: Aber, so fragen Sie sich, wie verwende ich dieses in der Datenbank gespeicherte zusammengesetzte Passwort?

Wenn sich der Benutzer anmeldet, übergibt er Ihnen den Benutzernamen und das Passwort (im Originaltext) Sie verwenden einfach denselben Hash-Code, um das eingegebene Kennwort zu hacken und die gespeicherte Version zu erhalten.

Vergleichen Sie also die beiden gehashten Kennwörter (Datenbank-Hash für den Benutzernamen und das eingegebene und gehashte Kennwort). Durch den Vergleich der Hashes können Sie feststellen, ob das eingegebene Kennwort mit dem Kennwort des ursprünglichen Benutzers übereinstimmt.

Extra Kredit:

Frage: Wenn ich Ihre Datenbank hätte, könnte ich dann nicht einfach einen Cracker wie John the Ripper nehmen und anfangen, Hashes zu erstellen, bis ich Übereinstimmungen mit Ihren gespeicherten, gehashten Passwörtern finde? (da die Benutzer ohnehin kurze Wörter aus dem Wörterbuch wählen ... sollte es einfach sein)

Antwort: Ja ... das können sie.

Daher sollten Sie Ihre Passwörter "salzen". Siehe die Wikipedia-Artikel über Salz

Voir "Wie man Daten mit Salt hasht" C# Beispiel (archiviert)

32voto

nilamo Punkte 1904

Als schlüsselgesicherter gesalzener Hash, unter Verwendung eines sicheren Algorithmus wie sha-512.

29voto

Mitch Wheat Punkte 287474

Die beste Sicherheitspraxis besteht darin, das Kennwort überhaupt nicht zu speichern (auch nicht verschlüsselt), sondern den Salted Hash (mit einem eindeutigen Salt pro Kennwort) des verschlüsselten Kennworts zu speichern.

Auf diese Weise ist es (praktisch) unmöglich, ein Klartext-Passwort auszulesen.

12voto

zebrabox Punkte 5616

Ich kann die Lektüre der Artikel nur empfehlen Schluss mit den Regenbogen-Tischen: Was Sie über sichere Passwortschemata wissen müssen [toter Link, Kopie im Internetarchiv ] und Wie man ein Passwort sicher speichert .

Viele Programmierer, mich eingeschlossen, glauben, dass sie Sicherheit und Hashing verstehen. Leider ist das bei den meisten von uns nicht der Fall.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X