it-swarm-eu.dev

Was sollte als Salz verwendet werden?

Ich höre immer, dass es am besten ist, Salze über gespeicherten Passwörtern zu verwenden, die dann irgendwie verkettet und anschließend gehasht werden. Aber ich weiß nicht was als Salz zu verwenden. Was wäre ein gutes Salz?

43
Sal

Angenommen, Sie haben eine Tabelle, in der Sie das Kennwort für jede Person speichern.

Gehen Sie wie folgt vor, um das generierte Passwort zu "speichern"

  1. holen Sie sich das Login vom Benutzer
  2. holen Sie sich das Passwort
  3. aus zufälligen Werten etwas Salz erzeugen. Nehmen wir an, Sie haben aus/dev/random (wie von @Michal vorgeschlagen) "a12bc34de56fg" erhalten.
  4. Verwenden Sie eine Hashing-Funktion, um das Hash-Passwort zu generieren. Angenommen, das ursprüngliche Passwort war "1password" und Sie verwenden ein beliebiges SHA Hashing. Sie werden es tun

hashed_password = SHA (SHA (SHA (.... SHA ("1passworda12bc34de56fg"))))))))

Speichern Sie das hashed_password mit dem Login und dem Salt in der Tabelle.

login      password      salt
--------------------------------------
john       a7b82783...   a12bc34de56fg

Und dann, um zu überprüfen, wann ein Benutzer auf Ihre App zugreift:

  1. holen Sie sich das Login und das Passwort
  2. rufen Sie das Salt für dieses Login aus der Datenbank ab (Sie haben das Salt: a12bc34de56fg)
  3. verketten Sie das Klartext-Passwort mit dem Salt und führen Sie das Hashing erneut durch:

hashed_password = SHA (SHA (SHA (.... SHA ("1passworda12bc34de56fg"))))))))

Überprüfen Sie, ob das von Ihnen berechnete hashed_password mit dem in der Datenbank gespeicherten übereinstimmt. Sie werden wissen, ob das Passwort korrekt war oder nicht.

Das ist es!. Sie können das Salz aus jeder beliebigen Quelle beziehen, die Sie mögen. Warum sollte es zufällig sein? Weil jedes nicht zufällige Salz es viel einfacher machen würde, zu versuchen, Ihre App brutal zu erzwingen.

13
woliveirajr

Die klassische Empfehlung für ein Salt für das Passwort-Hashing lautet:

  • A zufälliger Wert von 128 Bit oder mehr ;
  • erhalten von einem kryptographisch einwandfreien Zufallszahlengenerator ( /dev/random oder /dev/urandom am heutigen Tag Unixes);
  • eindeutig für jeden Eintrag (d. h. nicht dasselbe Salz wiederverwenden, für jedes neue Passwort ein neues Salz erzeugen);
  • im Klartext in der Datenbank gespeichert (damit das Salt bei der Überprüfung des Hash verfügbar ist).

Es gibt viele frühere Diskussionen zu verwandten Themen . Und am wichtigsten ist, dass Sie nicht Ihr eigenes Passwort-Hashing-Schema implementieren - Sie sollten eine bewährte, gut getestete, von Experten überprüfte Implementierung ( bcrypt/PBKDF2) .

30
Jesper M

Die Antwort lautet "fast alles", obwohl einige stärker sind als andere.

Nehmen wir an, Sie verwenden md5 (salt.password).

Ohne Salz knacken Hacker schnell die meisten Passwörter, indem sie den Hash in einer Rainbow-Tabelle nachschlagen.

Angenommen, Sie verwenden "x" als Salz für alle Ihre Passwörter. Viele Ihrer Passwörter werden immer noch gefunden, aber weniger. Das liegt daran, dass wenn das Passwort "p4ssw0rd" lautet, es mit dem Salz zu "xp4ssw0rd" wird - was es etwas schwieriger macht, aber nicht wesentlich.

Angenommen, Sie verwenden "% X88Fc + 7" als Salz für alle Ihre Passwörter. Zu diesem Zeitpunkt werden Rainbow-Tische nicht funktionieren. Als Folge der Verwendung eines Salt für alle Passwörter kann der Hacker jedoch eine Rainbow-Tabelle mit dieser Annahme erstellen und Rainbow-Tabellen im Voraus erstellen. Es ist viel sicherer, aber nicht perfekt.

Die nächst sicherste Option ist die Verwendung des Benutzernamens als Salt, dh die Verwendung von 'md5 (username.password)'. Dies besiegt wiederum die Standard-Rainbow-Tabelle, aber ein Hacker generiert möglicherweise eine Rainbow-Tabelle für einen bestimmten Benutzernamen (z. B. "root" oder "Administrator"), sodass der Hacker bei jeder Änderung des Kennworts einen Blick in einen Rainbow werfen kann Tisch, anstatt es wieder zu knacken.

Um noch sicherer zu sein, wählen Sie ein anderes zufälliges Salz für verschiedene Benutzer. Sie müssen dies zusammen mit dem Benutzernamen und dem Passwort-Hash speichern. Dies besiegt Rainbow-Tische vollständig.

Einige schlagen eher einen "sicheren" Zufallszahlengenerator als etwas Einfaches vor. Beispielsweise ist das Ausführen eines MD5 (Zeitstempel + Benutzername) beim Erstellen eines Kontos einfach, aber nicht kryptografisch sicher (da Zeitstempel und Benutzernamen vorhersehbar sind und daher eine geringe Entropie aufweisen). Aber da der Hacker ohnehin eine Kopie des Salzes hat, wenn er die Datenbank stiehlt, ist dies kein Problem.

10

Verwenden Sie für Salz nur zufällige Bits.

Unter Linux können Sie /dev/random Verwenden. Es ist ein Kernel-Zufallszahlengenerator, der auf Umgebungsgeräuschen basiert. Es ist ziemlich unvorhersehbar, außer für virtuelle Maschinen. Wenn Sie also eine physische Maus an Ihre Box angeschlossen haben, erhalten Sie mit /dev/random Zufällige Bits von hoher Qualität, die gut für Salz sind.

Hier ist ein guter Artikel , um damit zu beginnen. Siehe auch die externen Referenzen.

Hier ist ein Beispiel Java Code . Sehen Sie, wie das Salz in der DB in der Funktion createUser() generiert und gespeichert wird. Außer bei Verwendung von import Sun.misc. ... Es ist ein sehr guter Code.

1
Michał Šrajer