database - verschlüsseln - storing passwords securely




Der beste Weg, um ein Passwort in der Datenbank zu speichern (6)

Ich arbeite an einem Projekt mit Authentifizierung (Benutzername / Passwort)

Es verbindet sich auch mit einer Datenbank, so dass ich dachte, ich würde den Benutzernamen und das Passwort dort speichern, aber es scheint nicht so eine gute Idee, Kennwörter als nur ein Textfeld in einer Tabelle auf der db sitzen

Ich verwende C # und verbinde mich mit einem 2008 Express-Server. kann jemand (mit so vielen Beispielen wie möglich) vorschlagen, wie diese Art von Daten am besten gespeichert werden kann?

(Ich bin offen für die Idee, dass diese Information nicht in der Datenbank gespeichert wird, wenn ein guter Grund angegeben werden kann)


Als Key-hardened Salted Hash, unter Verwendung eines sicheren Algorithmus wie sha-512.


Die beste Sicherheitsvorkehrung besteht darin, das Passwort überhaupt nicht zu speichern (nicht einmal verschlüsselt), sondern den gesalzenen Hash (mit einem eindeutigen Wert pro Passwort) des verschlüsselten Passworts zu speichern.

Auf diese Weise ist es praktisch unmöglich, ein Klartext-Passwort abzurufen.


Ich würde MD5 / SHA1 das Passwort, wenn Sie nicht in der Lage sein, den Hash umzukehren. Wenn sich ein Benutzer anmeldet, können Sie einfach das angegebene Passwort verschlüsseln und mit dem Hashwert vergleichen. Hash-Kollisionen sind in diesem Fall fast unmöglich, es sei denn, jemand erhält Zugriff auf die Datenbank und sieht einen Hash, für den sie bereits eine Kollision haben.



Hintergrund Sie müssen nie ... wirklich ... das Passwort des Benutzers kennen. Sie möchten nur überprüfen, ob ein eingehender Benutzer das Passwort für ein Konto kennt.

Hash It: Speichere Benutzer-Passwörter hashed (Einweg-Verschlüsselung) über eine starke Hash-Funktion. Eine Suche nach "c # encrypt passwords" liefert eine Menge Beispiele.

Sehen Sie sich den Online-SHA1-Hash-Ersteller an, um eine Vorstellung davon zu bekommen, was eine Hash-Funktion erzeugt (aber verwenden Sie nicht SHA1 als Hash-Funktion, sondern etwas Stärkeres wie SHA256).

Ein Hash-Passwort bedeutet nun, dass Sie (und Datendiebe) nicht in der Lage sein sollten, diesen Hash wieder in das ursprüngliche Passwort umzukehren.

Wie man es benutzt: Aber, sagen Sie, wie verwende ich dieses in der Datenbank gespeicherte Passwort?

Wenn sich der Benutzer anmeldet, gibt er Ihnen den Benutzernamen und das Passwort (im ursprünglichen Text). Sie verwenden nur den gleichen Hash-Code, um das eingegebene Passwort zu hasen, um die gespeicherte Version zu erhalten.

Vergleichen Sie also die beiden Hash-Passwörter (Datenbank-Hash für Benutzername und das eingegebene & Hash-Passwort). Sie können feststellen, ob "das, was sie eingegeben haben" übereinstimmt, "was der ursprüngliche Benutzer für sein Passwort eingegeben hat", indem sie deren Hashes vergleicht.

Extra-Kredit:

Frage: Wenn ich Ihre Datenbank hätte, könnte ich dann nicht einfach einen Cracker wie John the Ripper nehmen und Hashes erstellen, bis ich Übereinstimmungen mit Ihren gespeicherten, gehashten Passwörtern finde? (Da die Benutzer sowieso kurze Worte wählen, sollte es einfach sein)

Antwort: Ja ... ja, sie können.

Also sollten Sie Ihre Passwörter "salzen". Siehe den salt

Siehe "Wie Hash-Daten mit Salz" C # -Beispiel


Sie haben Recht, dass das Speichern des Passworts in einem Nur-Text-Feld eine schreckliche Idee ist. Was jedoch den Standort betrifft , so werden Sie in den meisten Fällen (und ich kann mir ehrlich gesagt keine Gegenbeispiele vorstellen) die Speicherung eines Passwortes in der Datenbank als das Richtige betrachten. Mit Repräsentation meine ich, dass Sie das Passwort mit einem Salz (das für jeden Benutzer anders sein sollte) und einem sicheren 1-Weg-Algorithmus hashen und speichern, indem Sie das ursprüngliche Passwort wegwerfen. Wenn Sie dann ein Kennwort verifizieren möchten, hashen Sie den Wert (mit demselben Hashing-Algorithmus und demselben Salt) und vergleichen ihn mit dem Hashwert in der Datenbank.

Obwohl es gut ist, dass Sie darüber nachdenken und es eine gute Frage ist, ist dies tatsächlich ein Duplikat dieser Fragen (zumindest):

Um ein bisschen weiter auf dem Salz-Bit zu verdeutlichen, besteht die Gefahr einfach darin, ein Passwort zu haseln und zu speichern, dass ein Eindringling, der einen Zugriff auf Ihre Datenbank hat, immer noch sogenannte Rainbow-Tabellen verwenden kann , um den "entschlüsseln" zu können Passwort (mindestens diejenigen, die in der Regenbogen-Tabelle angezeigt werden). Um das zu umgehen, fügen Entwickler Passwörter hinzu, die Rainbow-Attacken, wenn sie richtig gemacht werden, einfach unmöglich machen. Beachten Sie, dass ein häufiges Missverständnis darin besteht, allen Passwörtern dieselbe eindeutige und lange Zeichenfolge hinzuzufügen. Während dies nicht schrecklich ist , ist es am besten, jedem Passwort einzigartige Salze hinzuzufügen. Lesen Sie dies für mehr.





passwords