Ich arbeite an einem Projekt, das eine Authentifizierung haben muss (Benutzername und Passwort).
Es stellt auch eine Verbindung zu einer Datenbank her, sodass ich dachte, ich würde den Benutzernamen und das Passwort dort speichern. Es scheint jedoch keine so gute Idee zu sein, Passwörter als nur ein Textfeld in einer Tabelle in der Datenbank zu haben.
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?
PS Ich bin offen für die Idee, dass diese Informationen nicht in der Datenbank gespeichert werden, wenn ein guter Grund angegeben werden kann
Antworten:
Sie haben Recht, dass das Speichern des Passworts in einem Klartextfeld eine schreckliche Idee ist. In Bezug auf den Standort ist es jedoch in den meisten Fällen richtig (und ich kann mir ehrlich gesagt keine Gegenbeispiele vorstellen), die Darstellung eines Kennworts in der Datenbank zu speichern . Durch die Darstellung meine ich , dass Sie die Passwort - Hash wollen mit einem Salz (die für jeden Benutzer anders sein sollen) und einen sicheren 1-Weg - Algorithmus und zu speichern , dass , wirft das ursprüngliche Passwort weg. Wenn Sie dann ein Kennwort überprüfen möchten, hashen Sie den Wert (unter Verwendung des gleichen Hashing-Algorithmus und Salt) und vergleichen ihn mit dem Hash-Wert in der Datenbank.
Also, während es eine gute Sache 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 etwas näher zu erläutern, besteht die Gefahr, dass ein Eindringling, der Ihre Datenbank in den Griff bekommt, weiterhin sogenannte Regenbogentabellen verwenden kann , um das zu "entschlüsseln" Passwort (zumindest diejenigen, die in der Regenbogentabelle angezeigt werden). Um dies zu umgehen , fügen Entwickler Passwörtern ein Salz hinzu , das bei richtiger Ausführung Regenbogenangriffe einfach unmöglich macht. Beachten Sie, dass ein häufiges Missverständnis darin besteht, allen Passwörtern einfach dieselbe eindeutige und lange Zeichenfolge hinzuzufügen. Obwohl dies nicht schrecklich ist , ist es am besten, jedem Passwort eindeutige Salze hinzuzufügen. Lesen Sie dies für mehr.
quelle
Hintergrund Sie müssen nie ... wirklich ... das Passwort des Benutzers kennen. Sie möchten nur überprüfen, ob ein eingehender Benutzer das Kennwort für ein Konto kennt.
Hash It: Speichern von Benutzerkennwörtern (Einwegverschlüsselung) über eine starke Hash-Funktion. Eine Suche nach "c # encrypt passwords" liefert eine Vielzahl von Beispielen.
Im Online-SHA1-Hash-Ersteller finden Sie eine Vorstellung davon, was eine Hash-Funktion erzeugt (verwenden Sie SHA1 jedoch nicht als Hash-Funktion, sondern verwenden Sie etwas Stärkeres wie SHA256).
Ein Hash-Passwort bedeutet nun, dass Sie (und Datenbankdiebe) diesen Hash nicht mehr in das ursprüngliche Passwort umkehren sollten.
Wie man es benutzt: 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 Hash-Passwörter (Datenbank-Hash für Benutzername und das eingegebene & Hash-Passwort). Sie können feststellen, ob "was sie eingegeben haben" mit "übereinstimmt, was der ursprüngliche Benutzer für sein Passwort eingegeben hat", indem Sie ihre Hashes vergleichen.
Extra Gutschrift:
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 Hash-Passwörtern finde? (da Benutzer sowieso kurze Wörter aus dem Wörterbuch auswählen ... 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 "Wie man Daten mit Salz hasht" C # -Beispiel
quelle
Als schlüsselgehärteter gesalzener Hash unter Verwendung eines sicheren Algorithmus wie sha-512.
quelle
Die beste Sicherheitspraxis besteht darin, das Kennwort überhaupt nicht (nicht einmal verschlüsselt) zu speichern, 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.
quelle
Ich würde dringend empfehlen, die Artikel Genug mit den Regenbogentabellen zu lesen : Was Sie über sichere Kennwortschemata wissen müssen [toter Link, Kopie im Internetarchiv ] und wie Sie ein Kennwort sicher speichern .
Viele Programmierer, auch ich, glauben, Sicherheit und Hashing zu verstehen. Leider tun es die meisten von uns einfach nicht.
quelle
Ich bin möglicherweise etwas vom Thema abweichend, da Sie die Notwendigkeit eines Benutzernamens und eines Passworts erwähnt haben und mein Verständnis des Problems zwar nicht das beste ist, aber ist OpenID eine Überlegung wert?
Wenn Sie OpenID verwenden, werden am Ende überhaupt keine Anmeldeinformationen gespeichert, wenn ich die Technologie richtig verstehe und Benutzer bereits vorhandene Anmeldeinformationen verwenden können, ohne dass eine neue Identität erstellt werden muss, die für Ihre Anwendung spezifisch ist.
Es ist jedoch möglicherweise nicht geeignet, wenn die betreffende Anwendung nur für den internen Gebrauch bestimmt ist
RPX bietet eine schöne einfache Möglichkeit, die OpenID-Unterstützung in eine Anwendung zu integrieren.
quelle
In Ihrem Szenario können Sie einen Blick auf die asp.net-Mitgliedschaft werfen. Es wird empfohlen, das Kennwort des Benutzers als Hash-Zeichenfolge in der Datenbank zu speichern. Sie können den Benutzer authentifizieren, indem Sie das eingehende Hash-Kennwort mit dem in der Datenbank gespeicherten Kennwort vergleichen.
Alles wurde für diesen Zweck erstellt. Schauen Sie sich die asp.net-Mitgliedschaft an
quelle
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 das angegebene Kennwort einfach 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.
quelle