it-swarm.com.de

Der beste Weg um ein Passwort in der Datenbank zu speichern

Ich arbeite an einem Projekt, für das eine Authentifizierung erforderlich ist (Benutzername und Passwort)

Es stellt auch eine Verbindung zu einer Datenbank her, sodass ich dachte, ich würde den Benutzernamen und das Kennwort dort speichern. Es scheint jedoch keine so gute Idee zu sein, Kennwörter nur als Textfeld in einer Tabelle in der Datenbank zu haben.

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

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

440
Crash893

Sie haben Recht, dass das Speichern des Kennworts in einem Nur-Text-Feld eine schreckliche Idee ist. Allerdings , was den Ort betrifft , werden Sie in den meisten Fällen darauf stoßen (und ich kann mir ehrlich gesagt keine Gegenbeispiele vorstellen ) Das Speichern der Darstellung eines Kennworts in der Datenbank ist die richtige Vorgehensweise. Mit Darstellung meine ich, dass Sie das Passwort mit einem Salt (das für jeden Benutzer unterschiedlich sein sollte) und einem sicheren 1-Wege-Algorithmus hashen und speichern möchten , dass , das ursprüngliche Passwort wegwerfend. Wenn Sie dann ein Kennwort überprüfen möchten, müssen Sie den Wert (unter Verwendung desselben Hashing-Algorithmus und Salt) hashen und mit dem hashten Wert in der Datenbank vergleichen.

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

Um das Salting-Bit ein Stück weiter zu erläutern, besteht die Gefahr, dass ein Eindringling, der Ihre Datenbank in den Griff bekommt, nach wie vor die so genannten Rainbow-Tabellen to verwenden kann, wenn er lediglich ein Kennwort hat und speichert in der Lage sein, das Passwort zu "entschlüsseln" (zumindest die, die in der Rainbow-Tabelle angezeigt werden). Um dies zu umgehen, fügen die Entwickler Passwörtern ein salt hinzu, was bei richtiger Vorgehensweise Regenbogenangriffe einfach unmöglich macht. Beachten Sie, dass ein häufiges Missverständnis darin besteht, allen Kennwörtern einfach dieselbe eindeutige und lange Zeichenfolge hinzuzufügen. Dies ist zwar nicht schrecklich , es ist jedoch am besten, jedem Kennwort eindeutige Salze hinzuzufügen. Lesen Sie dies für mehr.

384

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

Hash It: Benutzerkennwörter mit Hashing (Einwegverschlüsselung) über eine starke Hash-Funktion speichern. Eine Suche nach "C # -Kennwörtern verschlüsseln" bietet eine Fülle von Beispielen.

Im Online-SHA1-Hash-Ersteller finden Sie eine Vorstellung davon, was eine Hash-Funktion hervorbringt. (Verwenden Sie jedoch SHA1 nicht als Hash-Funktion, sondern etwas Stärkeres wie SHA256.).

Jetzt bedeutet ein Hashing von Passwörtern, dass Sie (und Datenbankdiebe) diesen Hash nicht in das ursprüngliche Passwort zurückverwandeln können.

Verwendung: Aber wie verwende ich dieses in der Datenbank gespeicherte Passwort?

Wenn sich der Benutzer anmeldet, erhalten Sie den Benutzernamen und das Kennwort (im Originaltext). Sie verwenden nur denselben Hash-Code, um das eingegebene Kennwort zu hashen und die gespeicherte Version abzurufen.

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

Zusätzliche Gutschrift:

Frage: Wenn ich Ihre Datenbank hätte, könnte ich dann nicht einfach einen Cracker wie John the Ripper nehmen und mit dem Erstellen von Hashes beginnen, bis ich Übereinstimmungen mit Ihren gespeicherten, gehashten Passwörtern finde? (da Benutzer kurze Wörter aussuchen, sollte es einfach sein)

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

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

Siehe Beispiel für das Hashing von Daten mit Salt

49
joej

Als schlüsselgehärteter Salted Hash mit einem sicheren Algorithmus wie sha-512.

30
nilamo

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

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

26
Mitch Wheat

Ich empfehle dringend, die Artikel zu lesen Genug mit den Rainbow-Tabellen: Was Sie über sichere Passwortschemata wissen müssen [toter Link, Kopie im Internetarchiv ] und - So speichern Sie ein Passwort sicher .

Viele Programmierer, auch ich, glauben, Sicherheit und Hashing zu verstehen. Leider tun die meisten von uns das einfach nicht.

10
zebrabox

Ich kann ein wenig vom Thema abweichen, da Sie die Notwendigkeit eines Benutzernamens und eines Passworts erwähnt haben, und mein Verständnis des Problems ist zugegebenermaßen nicht das Beste, aber ist OpenID eine Überlegung wert?

Wenn Sie OpenID verwenden, werden keine Anmeldeinformationen gespeichert, wenn ich die Technologie richtig verstehe und Benutzer bereits vorhandene Anmeldeinformationen verwenden können, sodass keine neue Identität für Ihre Anwendung erstellt werden muss.

Es ist jedoch möglicherweise nicht geeignet, wenn die betreffende Anwendung ausschließlich für den internen Gebrauch bestimmt ist

RPX bietet eine einfache Möglichkeit, die OpenID-Unterstützung in eine Anwendung zu integrieren.

6
Crippledsmurf

In Ihrem Szenario können Sie einen Blick auf die Mitgliedschaft bei asp.net werfen. Es empfiehlt sich, das Kennwort des Benutzers als Hash-Zeichenfolge in der Datenbank zu speichern. Sie können den Benutzer authentifizieren, indem Sie das gehashte eingehende Kennwort mit dem in der Datenbank gespeicherten Kennwort vergleichen.

Alles wurde für diesen Zweck gebaut, siehe asp.net-Mitgliedschaft

3
Ray Lu

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

2
waiwai933