Was ist Ihre bevorzugte Methode / Datentyp zum Speichern von Kennwörtern in einer Datenbank (vorzugsweise SQL Server 2005). In einigen unserer Anwendungen habe ich zunächst die .NET-Verschlüsselungsbibliotheken verwendet und sie dann als Binärdatei in der Datenbank gespeichert (16). Ist dies die bevorzugte Methode oder sollte ich einen anderen Datentyp verwenden oder mehr Speicherplatz als 16 zuweisen?
76
Antworten:
Ich speichere das gesalzene Hash-Äquivalent des Passworts in der Datenbank und niemals das Passwort selbst und vergleiche dann immer den Hash mit dem generierten, was der Benutzer übergeben hat.
Es ist zu gefährlich, die wörtlichen Passwortdaten jemals irgendwo zu speichern. Dies macht eine Wiederherstellung unmöglich, aber wenn jemand ein Passwort vergisst oder verliert, können Sie einige Überprüfungen durchführen und ein neues Passwort erstellen.
quelle
varchar
Datenbankspalte geeignet ist . Das letzte gute Denken ihres Teils ist das Definieren eines Formats ihrer Hash-Zeichenfolge, in dem das Salz in der Zeichenfolge enthalten ist.DIE bevorzugte Methode: Speichern Sie niemals Passwörter in Ihrer Datenbank. Nur Hashes davon. Nach Geschmack Salz hinzufügen.
quelle
Ich mache dasselbe, was Sie beschrieben haben, außer dass es als String gespeichert ist. I Base64 codiert den verschlüsselten Binärwert. Der zuzuweisende Speicherplatz hängt vom Verschlüsselungsalgorithmus / der Verschlüsselungsstärke ab.
Ich denke, Sie machen es richtig (vorausgesetzt, Sie verwenden ein Salz ).
quelle
Mit diesen Maßnahmen sind die Passwörter Ihres Benutzers ziemlich gut geschützt gegen:
quelle
Da das Ergebnis einer Hash-Funktion eine Reihe von Bytes im Bereich von 0 bis 255 (oder -128 bis 127, abhängig von der Vorzeichen Ihres 8-Bit-Datentyps) ist, ist es am sinnvollsten, sie als rohes Binärfeld zu speichern , da es die kompakteste Darstellung ist und keine zusätzlichen Codierungs- und Decodierungsschritte erfordert.
Einige Datenbanken oder Treiber bieten keine gute Unterstützung für binäre Datentypen, oder manchmal sind Entwickler mit ihnen einfach nicht vertraut genug, um sich wohl zu fühlen. In diesem Fall ist es akzeptabel, eine Binär-zu-Text-Codierung wie Base-64 oder Base-85 zu verwenden und den resultierenden Text in einem Zeichenfeld zu speichern.
Die Größe des erforderlichen Feldes wird durch die von Ihnen verwendete Hash-Funktion bestimmt. MD5 gibt immer 16 Bytes aus, SHA-1 gibt immer 20 Bytes aus. Sobald Sie eine Hash-Funktion ausgewählt haben, bleiben Sie normalerweise dabei, da zum Ändern alle vorhandenen Kennwörter zurückgesetzt werden müssen. Wenn Sie also ein Feld mit variabler Größe verwenden, erhalten Sie nichts.
In Bezug auf die "beste" Art, das Hashing durchzuführen, habe ich versucht, viele Antworten auf andere SO-Fragen zu diesem Thema zu geben:
quelle
Ich verwende den sha-Hash des Benutzernamens, eine Anleitung in der Webkonfiguration, und das Passwort, das als varchar (40) gespeichert ist. Wenn sie Brute Force / Wörterbuch wollen, müssen sie auch den Webserver für die Guid hacken. Der Benutzername unterbricht die Erstellung einer Regenbogentabelle in der gesamten Datenbank, wenn das Kennwort gefunden wird. Wenn ein Benutzer seinen Benutzernamen ändern möchte, setze ich gleichzeitig das Passwort zurück.
quelle
Ein einfacher Hash des Passworts oder sogar (Salt + Passwort) ist im Allgemeinen nicht ausreichend.
sehen:
http://www.matasano.com/log/958/enough-with-the-rainbow-tables-what-you-need-to-know-about-secure-password-schemes/
und
http://gom-jabbar.org/articles/2008/12/03/why-you-should-use-bcrypt-to-store-your-passwords
Beide empfehlen die bcrypt-Algorithmen. Kostenlose Implementierungen finden Sie online für die beliebtesten Sprachen.
quelle
Sie können mehrere Hashes in Ihrer Datenbank verwenden, dies erfordert nur ein wenig zusätzlichen Aufwand. Es lohnt sich jedoch, wenn Sie der Meinung sind, dass die geringste Chance besteht, dass Sie in Zukunft weitere Formate unterstützen müssen. Ich werde oft Passworteinträge wie verwenden
{hashId} $ {salt} $ {Hash-Passwort}
Dabei ist "hashId" nur eine Zahl, die ich intern verwende, um zu erkennen, dass ich beispielsweise SHA1 mit einem bestimmten Hash-Muster verwende. "Salz" ist ein Base64-codiertes zufälliges Salz; und "Hash-Passwort" ist ein Base64-codierter Hash. Wenn Sie Hashes migrieren müssen, können Sie Personen mit einem alten Kennwortformat abfangen und sie bei der nächsten Anmeldung dazu bringen, ihr Kennwort zu ändern.
Wie andere bereits erwähnt haben, möchten Sie mit Ihren Hashes vorsichtig sein, da es einfach ist, etwas zu tun, das nicht wirklich sicher ist, z. B. ist H (Salz, Passwort) weitaus schwächer als H (Passwort, Salz), aber gleichzeitig möchten Sie es Stimmen Sie den Aufwand dafür mit dem Wert des Website-Inhalts ab. Ich werde oft H (H (Passwort, Salz), Passwort) verwenden.
Schließlich sind die Kosten für die Verwendung von Base64-codierten Kennwörtern im Vergleich zu den Vorteilen der Verwendung verschiedener Tools, die Textdaten erwarten, gering. Ja, sie sollten flexibler sein, aber sind Sie bereit, Ihrem Chef mitzuteilen, dass er sein bevorzugtes Tool von Drittanbietern nicht verwenden kann, weil Sie ein paar Bytes pro Datensatz speichern möchten? :-)
Bearbeitet, um einen weiteren Kommentar hinzuzufügen: Wenn ich absichtlich einen Algorithmus vorschlagen würde, der sogar eine Zehntelsekunde lang jedes Passwort hasht, hätte ich das Glück, einfach aus dem Büro meines Chefs gelacht zu werden. (Nicht so glücklich? Er würde etwas aufschreiben, um es bei meiner nächsten jährlichen Überprüfung zu besprechen.) Das Brennen dieser Zeit ist kein Problem, wenn Sie Dutzende oder sogar Hunderte von Benutzern haben. Wenn Sie 100.000 Benutzer ansprechen, melden sich normalerweise mehrere Personen gleichzeitig an. Sie brauchen etwas schnelles und starkes, nicht langsames und starkes. Das "aber was ist mit den Kreditkarteninformationen?" ist bestenfalls unaufrichtig, da gespeicherte Kreditkarteninformationen nicht in der Nähe Ihrer regulären Datenbank liegen sollten und von der Anwendung ohnehin verschlüsselt würden, nicht von einzelnen Benutzern.
quelle
Wenn Sie mit ASP.Net arbeiten, können Sie die integrierte Mitgliedschafts-API verwenden.
Es unterstützt viele Arten von Speicheroptionen, einschließlich; Einweg-Hash, Zweiweg-Verschlüsselung, md5 + Salt. http://www.asp.net/learn/security für weitere Informationen.
Wenn Sie nichts Besonderes brauchen, ist dies ideal für Websites.
Wenn Sie ASP.Net nicht verwenden, finden Sie hier einen guten Link zu einigen Artikeln von 4guys und Codeproject
http://aspnet.4guysfromrolla.com/articles/081705-1.aspx http://aspnet.4guysfromrolla.com/articles/103002-1.aspx http://www.codeproject.com/KB/security/SimpleEncryption. aspx
quelle
Da es bei Ihrer Frage um Speichermethode und -größe geht, werde ich darauf eingehen.
Der Speichertyp kann entweder eine Binär- oder eine Textdarstellung sein (base64 ist die häufigste). Binär ist kleiner, aber ich finde es einfacher, mit Text zu arbeiten. Wenn Sie pro Benutzer Salting durchführen (anderes Salt pro Passwort), ist es einfacher, Salt + Hash als einzelne kombinierte Zeichenfolge zu speichern.
Die Größe ist vom Hash-Algorithmus abhängig. Die Ausgabe von MD5 beträgt immer 16 Bytes, SHA1 immer 20 Bytes. SHA-256 und SHA-512 sind 32 bzw. 64 Bytes. Wenn Sie die Textcodierung verwenden, benötigen Sie je nach Codierungsmethode etwas mehr Speicherplatz. Ich benutze Base64, weil der Speicher relativ billig ist. Base64 benötigt ein um ca. 33% größeres Feld.
Wenn Sie pro Benutzer gesalzen haben, benötigen Sie auch Platz für den Hash. Alles zusammen 64-Bit-Salt + SHA1-Hash (160 Bit) Base64-codiert benötigt 40 Zeichen, also speichere ich es als char (40).
Wenn Sie es richtig machen möchten, sollten Sie keinen einzigen Hash verwenden, sondern eine Schlüsselableitungsfunktion wie RBKDF2. SHA1- und MD5-Hashes sind wahnsinnig schnell. Selbst eine Single-Threaded-Anwendung kann etwa 30.000 bis 50.000 Kennwörter pro Sekunde haschen, das sind bis zu 200.000 Kennwörter pro Sekunde auf einem Quad-Core-Computer. GPUs können 100x bis 1000x so viele Passwörter pro Sekunde hashen. Mit solchen Geschwindigkeiten wird Brute-Force-Angriff zu einer akzeptablen Angriffsmethode. Mit RBKDF2 können Sie die Anzahl der Iterationen angeben, um zu optimieren, wie "langsam" Ihr Hashing ist. Es geht nicht darum, das System in die Knie zu zwingen, sondern eine Reihe von Iterationen auszuwählen, damit Sie die Obergrenze für den Hash-Durchsatz begrenzen (z. B. 500 Hashes pro Sekunde). Eine zukunftssichere Methode wäre, die Anzahl der Iterationen in das Passwortfeld aufzunehmen (Iterationen + Salt + Hash). Dies würde es ermöglichen, in Zukunft immer mehr Iterationen durchzuführen, um mit leistungsstärkeren Prozessoren Schritt zu halten. Um noch flexibler zu sein, verwenden Sie varchar, um in Zukunft potenziell größere / alternative Hashes zu ermöglichen.
Die .Net-Implementierung lautet RFC2892DeriveBytes http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx
quelle