Was ist die optimale Länge für das Benutzerkennwort Salt? [geschlossen]


127

Jegliches Salz hilft natürlich beim Salzen und Hashing des Passworts eines Benutzers. Gibt es Best Practices für die Dauer des Salzes? Ich werde das Salz in meiner Benutzertabelle speichern, daher möchte ich den besten Kompromiss zwischen Speichergröße und Sicherheit. Ist ein zufälliges Salz mit 10 Zeichen genug? Oder brauche ich etwas länger?


10
Ich habe keine Empfehlung zur Länge des Salzes, aber die Antworten, die hier auftauchen, enthalten viele schlechte Informationen. Ihr Salz sollte auf jeden Fall: - zufällig sein - geheim sein (kein einziger Wert, der in Ihrem Programmabbild oder Ihrer Konfigurationsdatei gespeichert ist). Das Salz ist kein kryptografisches Geheimnis, daher ist es kein Problem, es in Ihrem Tisch zu speichern. Der einzige Zweck eines Salt besteht darin, sicherzustellen, dass Sie ein anderes Ergebnis erhalten, wenn verschiedene Instanzen desselben Elements gehasht (oder verschlüsselt) werden.
Michael Burr

2
Für diejenigen, die nicht wissen, was Salz ist: <a href=" en.wikipedia.org/wiki/Salt_(cryptography)"> Salz (Kryptographie) </a> auf Wikipedia
David Koelle

1
Oder ob es ein optimales Verhältnis zwischen der Länge des Salzes und der Länge der Hash-Ausgabe gibt? 8-Byte-Salz reicht möglicherweise für HMAC-SHA-256, möglicherweise jedoch nicht für HMAC-SHA-512.
Crend King

1
Kryptografisch zufälliges Salz mit der gleichen Größe wie die Ausgabe der Hashing-Funktion bedeutet, dass ein Angriff "Alle möglichen Salze ausprobieren" (plus ein Passwortwörterbuch) genauso viel Aufwand erfordert wie ein Angriff "Alle möglichen Hash-Ergebnisse versuchen" - eine Standard-Brute-Force . Ein kürzeres Salz bedeutet, dass Sie ein Salzwörterbuch und ein Passwortwörterbuch als Brute-Force-Angriff verwenden können.
Richard Gadsden

-1 Zugegeben, beantwortet die Frage nicht (versucht es auch nicht).
user359996

Antworten:


70

Die meisten dieser Antworten sind etwas falsch und zeigen eine Verwechslung zwischen Salzen und kryptografischen Schlüsseln. Der Zweck des Einfügens von Salzen besteht darin, die Funktion zum Hashing des Kennworts jedes Benutzers so zu ändern, dass jeder gespeicherte Kennwort-Hash einzeln angegriffen werden muss. Die einzige Sicherheitsanforderung besteht darin, dass sie pro Benutzer eindeutig sind. Es hat keinen Vorteil, dass sie unvorhersehbar oder schwer zu erraten sind.

Salze müssen nur lang genug sein, damit das Salz jedes Benutzers einzigartig ist. Es ist sehr unwahrscheinlich, dass sich zufällige 64-Bit-Salze jemals wiederholen, selbst bei einer Milliarde registrierter Benutzer. Dies sollte also in Ordnung sein. Ein einzeln wiederholtes Salt ist ein relativ geringes Sicherheitsrisiko. Es ermöglicht einem Angreifer, zwei Konten gleichzeitig zu durchsuchen, beschleunigt jedoch insgesamt die Suche in der gesamten Datenbank nicht wesentlich. Selbst 32-Bit-Salze sind für die meisten Zwecke akzeptabel. Im schlimmsten Fall wird die Suche eines Angreifers um etwa 58% beschleunigt. Die Kosten für die Erhöhung der Salze über 64 Bit hinaus sind nicht hoch, aber es gibt keinen Sicherheitsgrund dafür.

Die Verwendung eines standortweiten Salt zusätzlich zum Salz pro Benutzer bietet einige Vorteile. Dies verhindert mögliche Kollisionen mit an anderen Standorten gespeicherten Passwort-Hashes und verhindert die Verwendung von Regenbogen-Allzwecktabellen, obwohl sogar 32 Bit Salz reicht aus, um Regenbogentische zu einem unpraktischen Angriff zu machen.

Noch einfacher - und Entwickler übersehen dies immer -, wenn Sie eindeutige Benutzer-IDs oder Anmeldenamen haben, dienen diese als Salz. Wenn Sie dies tun, sollten Sie ein Site-weites Salt hinzufügen, um sicherzustellen, dass Sie sich nicht mit Benutzern eines anderen Systems überschneiden, die dieselbe gute Idee hatten.


16
Es ist von Vorteil, wenn Salze unvorhersehbar sind. Ein vorhersehbares Salz könnte vorhergesagt und bei einem Hash-Table-Angriff verwendet werden. Wenn Ihr Salt beispielsweise nur die Benutzer-ID ist, enthält eine einfache Alpha-Hash-Tabelle, die lang genug ist, nicht nur alle Kennwörter, sondern alle Kombinationen aus Benutzername und Kennwort.
Richard Gadsden

6
Beachten Sie in Bezug auf Ihren letzten Absatz, dass wenn Sie ein Site-weites Salz verwenden, dies genau das sein sollte: Site-weit. Nicht anwendungsweit, dh jede neue Instanz, die Sie von Ihrer Anwendung installieren, sollte ein neues Site-weites Salt generieren. Wenn Windows beispielsweise in jeder Windows-Authentifizierungsdatenbank dasselbe Salt verwendet, lohnt es sich, eine Regenbogentabelle für dieses Salt zu erstellen. Wenn jedoch bei jeder Installation von Windows ein neues Salt generiert wird, ist dies nicht der Fall.
Richard Gadsden

5
Das Problem ist nicht wirklich, dass das Salz schwer zu erraten sein muss. Der Angreifer muss das Salz nicht erraten: Jeder, der Zugriff auf den Hash hat, hat das Salz bereits. Das Problem ist, dass Ihre Salze, wenn sie sehr häufig sind (wie Benutzernamen), möglicherweise mit denen an anderen Standorten identisch sind. Zu diesem Zeitpunkt benötigt der Angreifer einen viel kleineren Satz von Regenbogentabellen, um Angriffe möglich zu machen. Aus diesem Grund wird die Salzidee pro Standort erwähnt, um diese Art von Kollision mit anderen Standorten zu vermeiden.
Nate CK

3
Kurzer Hinweis: Wenn Sie Benutzernamen als Salt verwenden, kann dies ein Problem sein, wenn sich Benutzernamen ändern. Praktisch (trotz der Angaben in den Designdokumenten des Kunden) habe ich festgestellt, dass Benutzer häufig Benutzernamen ändern möchten.
SilentSteel

5
@ NateC-K, Die Salzidee pro Standort, von der Sie sprechen, heißt Pfeffer.
Pacerier

35

Derzeit akzeptierte Standards für das Hashing von Passwörtern erstellen für jedes Passwort ein neues 16 Zeichen langes Salt und speichern das Salt mit dem Passwort-Hash.

Natürlich sollte die richtige kryptografische Sorgfalt angewendet werden, um wirklich zufälliges Salz zu erzeugen.


6
Der Charakter ist etwas schlecht definiert. Sie sollten Byte sagen .
CodesInChaos

10
@ CodesInChaos Ich glaube du meinst Oktett ;-)
user2864740

1
Hallo! Es scheint, dass der Wikipedia-Artikel geändert wurde - vielleicht sollten Sie sich auf en.wikipedia.org/wiki/PBKDF2 beziehen oder so?
Boris Treukhov


24

Bearbeiten: Meine unten stehende Antwort beantwortet die gestellte Frage, aber die "echte" Antwort lautet: Verwenden Sie einfach bcrypt , scrypt oder Argon2 . Wenn Sie Fragen wie diese stellen, verwenden Sie mit ziemlicher Sicherheit Tools auf einer zu niedrigen Ebene.

Ehrlich gesagt gibt es keinen vertretbaren Grund dafür, dass das Salz nicht genau so lang ist wie das Hash-Passwort. Wenn Sie SHA-256 verwenden, haben Sie einen 256-Bit-Hash. Es gibt keinen Grund, kein 256-Bit-Salz zu verwenden.

Mehr als 256 Bit bringen Ihnen mathematisch keine Verbesserung der Sicherheit. Wenn Sie jedoch ein kürzeres Salz verwenden, kann dies immer dazu führen, dass ein Regenbogentisch Ihre Salzlänge einholt - insbesondere bei kürzeren Salzen.


10
Das ist keine so große Sache; Der Benutzer wird den Unterschied zwischen einem Millisekunden-Hash und einem halben Sekunden-Hash kaum bemerken. Außerdem sollte das Hashing von Passwörtern länger dauern, um Brute-Force-Angriffe zu verlangsamen - obwohl typische drei für 15 Minuten gesperrte Treffer besser sind. Verschwenden Sie dafür CPU-Zyklen? Ja, wie auch immer. Die CPU verbringt sowieso mehr Zeit im Leerlauf als auf den meisten Websites. Was macht es also aus? Wenn Sie auf Leistungsprobleme stoßen, skalieren Sie.
Randolpho

14
Salze verteidigen gegen Regenbogentische. Ein 512-Bit-Salt mit einem 256-Bit-Hash führt immer noch nur zu 256 Bit Entropie im endgültigen Kennwort.
Stephen Touset

8
Langsames Hashing ist eine Funktion, kein Fehler.
Outis

7
Wenn Sie einen 3-Bit-Hash haben, wird Ihr 9999-Bit-Salt immer noch nur bis zu 3 mögliche Entropiebits hashen. Eine Regenbogentabelle müsste nur drei Salze für jedes Passwort finden, die zu einer anderen Ausgabe führen. Dies ist ein konstanter Multiplikationsfaktor und wird daher aus dem Big-O verworfen.
Stephen Touset

2
.................................................. .................................... bestimmtes System. Der Zweck von Salzen besteht darin, Vorberechnungsangriffe zu stoppen, sodass Hashes nicht gesucht und sofort in Klartext umgewandelt werden können . Bei einem 9999-Bit-Salt bleibt Ihr Passwort ein Geheimnis , während bei einem 3-Bit-Salt Ihr Passwort mittlerweile der ganzen Welt bekannt ist (und sie können sich damit bei Ihren anderen Konten anmelden, da viele Leute häufig Passwörter wiederverwenden). Ich finde es amüsant, dass 5 Leute hier Ihren Kommentar aufgrund des Wortes "Entropie" tatsächlich positiv bewertet haben.
Pacerier

7

Wikipedia :

Die in Linux, BSD Unixes und Solaris verwendeten Methoden SHA2-crypt und bcrypt haben Salze von 128 Bit. Diese größeren Salzwerte machen Vorberechnungsangriffe für nahezu jede Kennwortlänge auf absehbare Zeit gegen diese Systeme unmöglich.

128-Bit-Salz (16 Byte) reicht aus. Sie können es als Folge von 128 / 4 = 32hexadezimalen Ziffern darstellen.


Es scheint mir, dass ein Beispiel für die Verwendung anderer sicherer Systeme ein gutes Beispiel für die Best Practice ist.
CJBarth

1
@ mklement0 Danke, ich habe die Antwort aktualisiert.
Andrii Nemchenko

2

Eine Antwort könnte darin bestehen, den Wert, den der zu verwendende Hash für die Sicherheit bietet, als Salzgröße zu verwenden.

Wenn Sie beispielsweise SHA-512 verwenden möchten, verwenden Sie 256-Bit-Salt, da die von SHA-512 bereitgestellte Sicherheit 256-Bit beträgt.

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.