Woher sollen Salz-Hash-Werte kommen?


12

Wenn Sie einem Hash-Wert Salt-Werte für ein Passwort hinzufügen, das nicht im Klartext gespeichert werden kann, von welchem ​​Ort kommen die Salt-Werte am besten? Nehmen wir für den Kontext an, dass dies für Kennwörter bei einer Webseitenanmeldung gilt.


@ DevArt, ich dachte, es ist hier besser geeignet, weil es eine sehr subjektive Antwort erfordert. Ein Salt-Wert kann von überall abgerufen werden. Daher frage ich: "Wo ist Ihrer Meinung nach der sicherste Ort, an dem Salt-Werte abgerufen werden können: Client oder Server?"
Morgan Herlocker

Antworten:


7

Normalerweise habe ich eine Spalte created TIMESTAMPin einer Benutzertabelle, damit ich sehen kann, wann sich der Benutzer registriert hat. Ich möchte keine zusätzliche Spalte für Salt hinzufügen, daher verwende ich die Timestamp-Spalte als Salt:

SHA1(password + created)

Ich gehe dann davon aus, dass Sie, wenn sich der Benutzer erneut anmeldet, das Datum basierend auf dem Benutzernamen abrufen, wenn Sie die Überprüfung erneut durchführen.
Morgan Herlocker

1
@Prof: Ja, so wie Sie es tun, wenn Sie eine bestimmte Spalte für Salz haben, also keinen Unterschied in dieser Perspektive.
Jonas

7

Ist das wichtig?

Das Salz dient zwei Zwecken. Es macht es unpraktisch, große Tabellen mit vorgefertigten Passwörtern ("Regenbogentabellen") zu verwenden, und es lässt identische Passwörter in der Liste der Hashes unterschiedlich aussehen. Indem Sie die identischen Passwörter unterschiedlich aussehen lassen, vermeiden Sie ein Problem, bei dem mehrere Personen ein bestimmtes Passwort verwenden, das vermutlich ein allgemeines schwaches ist.

Daher sollte jedes Konto über ein eigenes Salz verfügen, und die Salze sollten nicht übermäßig vorhersehbar sein, da es wahrscheinlich keine Gruppe von Salzen gibt, die auftreten werden. (Wenn viele Sites bei 1 anfingen und hochgezählt wurden, könnten Bösewichte beispielsweise Regenbogentabellen mit einer geringen Anzahl von Salzen erstellen.) Sie müssen in keiner Weise zufällig sein, außer im Allgemeinen unvorhersehbar. Sie sind nicht geheimer als der Hash selbst, daher müssen sie nicht unbedingt unermesslich sein.

Verwenden Sie eine beliebige Methode, um ein Salz zu erzeugen. Wenn es im Vergleich zur Anzahl der Accounts viele potenzielle Salt-Werte gibt (frühe Unix-Systeme verwendeten häufig zwei Bytes für eine mögliche Anzahl von 65536), würde eine halbzufällige Zuweisung fast nie ein doppeltes Salt ausgeben.


1
Ich habe allgemein gesehen, dass das zweite Problem - identische Passwörter, die unterschiedlich aussehen - durch Verketten des Benutzernamens, des Salt und des Passworts und durch Hashing der gesamten Zeichenfolge behoben wurde. Dadurch entfällt die Notwendigkeit, ein eindeutiges Salz pro Konto zu generieren.
Justin Cave

1
@Justin: Interessant, ich habe den Benutzernamen noch nie als Teil des Hash gesehen, aber es ist in der Tat ein guter Weg, um etwas Entropie hinzuzufügen. Ich würde trotzdem ein Pseudo-Zufalls-Salt verwenden, nur weil es nicht viel kostet, eins zu generieren.
Matthieu M.

2
@Matthieu Mit dem Nachteil, dass Sie es irgendwo speichern müssen und wenn beide Seiten einer Transaktion es benötigen, müssen Sie es auch senden. Mit dem Benutzernamen wissen es beide Seiten bereits.
Matthew Frederick

2
@Justin: In diesem Fall verwenden Sie den Benutzernamen als Salt. Es beantwortet beide Aufgaben des Salzes: Regenbogentabellen unpraktisch zu machen und ähnliche Passwörter anders aussehen zu lassen.
David Thornley

@ David - Richtig, Sie können es als den Benutzernamen ansehen, der Teil des Salt wird. Ich möchte immer noch ein zusätzliches Salz, damit der Angreifer die Kombinationen aus Benutzername und Passwort nicht anhand einer Regenbogentabelle finden kann. Ohne ein explizites Salt erhöhen Sie lediglich die Größe der Zeichenfolge, die der Angreifer aus der Regenbogentabelle benötigt, um die Länge des Benutzernamens (der wahrscheinlich kurz ist und entweder ganz in Klein- oder ganz in Großbuchstaben geschrieben wird). Ein konstantes Salz ist ausreichend, um einen Regenbogentabellenangriff zu vereiteln, es sei denn, Ihre Site ist groß genug, dass ein Angreifer eine ortsspezifische Regenbogentabelle generieren würde.
Justin Cave

3

Jedes Mal, wenn Sie ein neues Passwort speichern möchten (Registrierung, Passwort-Reset, Passwort-Update), ist eine gute Technik:

  • neues Salz erzeugen
    • Verwenden Sie einen kryptografisch sicheren Pseudozufallszahlengenerator
    • Verwenden Sie ein Salz mit angemessener Größe. Ein guter Wert ist die Blockgröße des zugrunde liegenden Hash-Algorithmus (möglicherweise SHA-256).
  • Erzeugen Sie ein neues Passwort-Token
    • Erstellen Sie eine hmac-Funktion aus dem zugrunde liegenden Hash-Algorithmus (möglicherweise SHA-256) und verwenden Sie dabei das Salt als hmac-Schlüssel
    • for i in (0...65536) { password = hmac(password) }
    • das ergebnis der iterierten anwendungen der hmac-funktion ist das kennwort-token
  • Bewahren Sie den Salt- und den Passwort-Token auf
    • Speichern Sie nicht das ursprüngliche Passwort
    • Optional können Sie den zugrunde liegenden Hash-Algorithmus und die Abschnitte für die Auffindbarkeit speichern

1

Nutzen Sie das Framework. In .NET können Sie den RNGCryptoServoiceProvider verwenden ...

        // If salt is not specified, generate it on the fly.
        if (saltBytes == null)
        {
            // Define min and max salt sizes.
            int minSaltSize = 4;
            int maxSaltSize = 8;

            // Generate a random number for the size of the salt.
            Random  random = new Random();
            int saltSize = random.Next(minSaltSize, maxSaltSize);

            // Allocate a byte array, which will hold the salt.
            saltBytes = new byte[saltSize];

            // Initialize a random number generator.
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

            // Fill the salt with cryptographically strong byte values.
            rng.GetNonZeroBytes(saltBytes); 
        }

Andere Frameworks sollten ähnliche Klassen haben, die Sie nutzen können. Um Zufälligkeit zu erreichen, setzt Software oftmals den Benutzer gegenüber den Randomoben genannten ein. Die zufällige Bewegung einer Maus in einem definierten Bereich, um Salz bereitzustellen, ist eine Option, die von TrueCrypt verwendet wird. Es kommt auf Ihre spezifischen Bedürfnisse und Ihr Sicherheitsniveau an. da könnte dein salz einfach sein !@#$%.


1

Sie generieren serverseitig ein Salt und weisen es bei seiner Erstellung einem Benutzerkonto zu. Verwenden Sie besser eine Krypto-Generierungs-API, die mit Ihrem Framework verfügbar ist, aber im Prinzip ist jede Sequenz ausreichend.

Normalerweise werden Dinge wie folgt gespeichert:

User
-------------------
ID
Username
PasswordHashWithSalt

Beispiel:

PasswordHashWithSalt =

A15CD9652D4F4A3FB61A2A422AEAFDF0DEA4E703 j5d58k4b56s8744q


Weisen Sie es basierend auf was zu? Muss es nicht von einem Wert stammen, der erhalten bleibt, damit es repliziert werden kann, wenn sich der Benutzer nach der Erstellung erneut anmeldet?
Morgan Herlocker

Mit "zuweisen" meine ich ein Salt per Benutzername / Passwort-Paar (Account) generieren und in der Datenbank speichern. Wenn Sie sich anmelden müssen, verwenden Sie dieses gespeicherte Salz, um die Dinge zu überprüfen.

1

Verwenden Sie bcrypt und lesen Sie diesen Artikel, da normale Hashes in der heutigen Zeit keinen ernsthaften Schutz bieten.

Erwägen Sie die Verwendung des SDR Zero Knowledge Password-Protokolls, das zahlreiche Open Source-Bibliotheken enthält und patentfrei ist.

SDR erfordert Salz und der beste Ort dafür ist der Kunde. Zeit ihre Tastenanschläge, Mausbewegungen, Hash ihre Umgebungsvariablen, Zufallszahlen, Dateierstellungszeiten in ihrem temporären Ordner, um am Ende auf unvorhersehbare Weise Salz von Ihrem Server zu machen. SDR nimmt das Salt, eine große Primzahl, das Benutzerpasswort und generiert einen Verifiziererschlüssel. Sie speichern kein Passwort, es verlässt nie den Computer, aber Sie können überprüfen, ob das Passwort für den Überprüfungsschlüssel und das Salt gültig ist. Es ist immun gegen Man in the Middle- und Dictionary-Angriffe. Verschlüsseln Sie die Schlüssel und Salt in der Datenbankspalte, um sicherzugehen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.