Ich stieß auf eine Diskussion, in der ich erfuhr, dass das, was ich getan hatte, nicht darin bestand, Passwörter zu salzen, sondern sie zu peppen, und seitdem habe ich begonnen, beides mit einer Funktion wie:
hash_function($salt.hash_function($pepper.$password)) [multiple iterations]
Ignoriert man den gewählten Hash-Algorithmus (ich möchte, dass dies eine Diskussion über Salze und Paprika ist und nicht über bestimmte Algorithmen, aber ich verwende einen sicheren), ist dies eine sichere Option oder sollte ich etwas anderes tun? Für diejenigen, die mit den Begriffen nicht vertraut sind:
Ein Salt ist ein zufällig generierter Wert, der normalerweise mit der Zeichenfolge in der Datenbank gespeichert wird, um die Verwendung von Hash-Tabellen zum Knacken von Kennwörtern zu verhindern. Da jedes Passwort sein eigenes Salz hat, müssen sie alle einzeln brutal gezwungen werden, um sie zu knacken. Da das Salt jedoch mit dem Kennwort-Hash in der Datenbank gespeichert ist, bedeutet ein Datenbankkompromiss, dass beide verloren gehen.
Ein Pfeffer ist ein standortweiter statischer Wert, der getrennt von der Datenbank gespeichert wird (normalerweise im Quellcode der Anwendung fest codiert) und der geheim sein soll. Es wird verwendet, damit ein Kompromiss der Datenbank nicht dazu führt, dass die Kennworttabelle der gesamten Anwendung brutal erzwungen wird.
Fehlt mir etwas und ist das Salzen und Peppen meiner Passwörter die beste Option, um die Sicherheit meiner Benutzer zu schützen? Gibt es eine potenzielle Sicherheitslücke auf diese Weise?
Hinweis: Nehmen Sie zum Zweck der Diskussion an, dass die Anwendung und die Datenbank auf separaten Computern gespeichert sind, keine Kennwörter usw. freigeben, sodass ein Verstoß gegen den Datenbankserver nicht automatisch einen Verstoß gegen den Anwendungsserver bedeutet.
Antworten:
OK. Da ich zu schreiben über diese müssen über und über allein, ich werde auf Pfeffer eine letzte kanonische Antwort tun.
Der scheinbare Vorteil von Paprika
Es scheint ziemlich offensichtlich, dass Paprika Hash-Funktionen sicherer machen sollte. Ich meine, wenn der Angreifer nur Ihre Datenbank erhält, sollten die Kennwörter Ihrer Benutzer sicher sein, oder? Scheint logisch, oder?
Deshalb glauben so viele Leute, dass Paprika eine gute Idee ist. Es ergibt Sinn".
Die Realität der Paprika
In den Bereichen Sicherheit und Kryptografie reicht "Sinn machen" nicht aus. Etwas muss beweisbar und sinnvoll sein, damit es als sicher gilt. Darüber hinaus muss es wartbar implementiert werden können. Das sicherste System, das nicht gewartet werden kann, gilt als unsicher (denn wenn ein Teil dieser Sicherheit ausfällt, fällt das gesamte System auseinander).
Und Paprika passt weder zu den nachweisbaren noch zu den wartbaren Modellen ...
Theoretische Probleme mit Paprika
Nachdem wir die Bühne bereitet haben, schauen wir uns an, was mit Paprika nicht stimmt.
Das Einspeisen eines Hash in einen anderen kann gefährlich sein.
In Ihrem Beispiel tun Sie das
hash_function($salt . hash_function($pepper . $password))
.Wir wissen aus früheren Erfahrungen, dass das "Einspeisen" eines Hash-Ergebnisses in eine andere Hash-Funktion die Gesamtsicherheit verringern kann. Der Grund ist, dass beide Hash-Funktionen zum Angriffsziel werden können.
Aus diesem Grund verwenden Algorithmen wie PBKDF2 spezielle Operationen, um sie zu kombinieren (in diesem Fall hmac).
Der Punkt ist, dass es zwar keine große Sache ist, es aber auch keine triviale Sache ist, einfach herumzuwerfen. Kryptosysteme wurden entwickelt, um Fälle zu vermeiden, die funktionieren sollten, und konzentrieren sich stattdessen auf Fälle, die funktionieren sollen.
Dies mag zwar rein theoretisch erscheinen, ist es aber tatsächlich nicht. Beispielsweise kann Bcrypt keine beliebigen Passwörter akzeptieren . Das Übergeben
bcrypt(hash(pw), salt)
kann also in der Tat zu einem weitaus schwächeren Hash führen, alsbcrypt(pw, salt)
wennhash()
eine binäre Zeichenfolge zurückgegeben wird.Gegen Design arbeiten
Die Art und Weise, wie bcrypt (und andere Passwort-Hashing-Algorithmen) entwickelt wurden, besteht darin, mit einem Salz zu arbeiten. Das Konzept eines Pfeffers wurde nie eingeführt. Dies mag wie eine Trivialität erscheinen, ist es aber nicht. Der Grund ist, dass ein Salz kein Geheimnis ist. Es ist nur ein Wert, der einem Angreifer bekannt sein kann. Ein Pfeffer hingegen ist per Definition ein kryptografisches Geheimnis.
Die aktuellen Passwort-Hashing-Algorithmen (bcrypt, pbkdf2 usw.) sind alle so konzipiert, dass sie nur einen geheimen Wert (das Passwort) annehmen. Das Hinzufügen eines weiteren Geheimnisses zum Algorithmus wurde überhaupt nicht untersucht.
Das heißt nicht, dass es nicht sicher ist. Das heißt, wir wissen nicht, ob es sicher ist. Und die allgemeine Empfehlung für Sicherheit und Kryptografie lautet: Wenn wir es nicht wissen, ist dies nicht der Fall.
Bis Algorithmen von Kryptographen für die Verwendung mit geheimen Werten (Peppers) entworfen und überprüft werden, sollten aktuelle Algorithmen nicht mit ihnen verwendet werden.
Komplexität ist der Feind der Sicherheit
Ob Sie es glauben oder nicht, Komplexität ist der Feind der Sicherheit . Das Erstellen eines Algorithmus, der komplex aussieht, kann sicher sein oder auch nicht. Aber die Chancen stehen sehr gut, dass es nicht sicher ist.
Wesentliche Probleme mit Paprika
Es ist nicht wartbar
Ihre Implementierung von Paprika schließt die Möglichkeit aus, die Pfeffertaste zu drehen. Da der Pfeffer am Eingang der Einwegfunktion verwendet wird, können Sie den Pfeffer während der gesamten Lebensdauer des Werts niemals ändern. Dies bedeutet, dass Sie sich einige Wonky-Hacks einfallen lassen müssen, um die Schlüsselrotation zu unterstützen.
Dies ist äußerst wichtig, da es immer dann erforderlich ist, wenn Sie kryptografische Geheimnisse speichern. Das Fehlen eines Mechanismus zum Drehen von Schlüsseln (regelmäßig und nach einem Verstoß) ist eine große Sicherheitslücke.
Und Ihr aktueller Pfefferansatz würde erfordern, dass jeder Benutzer entweder sein Passwort durch eine Rotation vollständig ungültig macht oder wartet, bis sein nächstes Login rotiert (was möglicherweise nie der Fall ist) ...
Das macht Ihren Ansatz im Grunde zu einem sofortigen No-Go.
Sie müssen Ihre eigene Krypto rollen
Da kein aktueller Algorithmus das Konzept eines Pfeffers unterstützt, müssen Sie entweder Algorithmen erstellen oder neue erfinden, um einen Pfeffer zu unterstützen. Und wenn Sie nicht sofort erkennen können, warum das eine wirklich schlechte Sache ist:
Rollen Sie NIEMALS Ihre eigene Krypto ...
Der bessere Weg
Von allen oben beschriebenen Problemen gibt es zwei Möglichkeiten, mit der Situation umzugehen.
Verwenden Sie einfach die vorhandenen Algorithmen
Wenn Sie bcrypt oder scrypt korrekt verwenden (mit hohen Kosten), sollten alle bis auf die schwächsten Wörterbuchkennwörter statistisch sicher sein. Der aktuelle Rekord für das Hashing von bcrypt zu Kosten von 5 liegt bei 71.000 Hashes pro Sekunde. Bei dieser Rate würde es Jahre dauern, bis ein zufälliges Passwort mit 6 Zeichen geknackt ist. Wenn man bedenkt, dass meine empfohlenen Mindestkosten 10 betragen, werden die Hashes pro Sekunde um den Faktor 32 reduziert. Wir würden also nur über 2200 Hashes pro Sekunde sprechen. Bei dieser Rate können sogar einige Wörterbuchphrasen oder Änderungen sicher sein.
Außerdem sollten wir an der Tür nach diesen schwachen Klassen von Passwörtern suchen und sie nicht zulassen. Wenn das Knacken von Passwörtern weiter fortgeschritten ist, sollten auch die Anforderungen an die Passwortqualität steigen. Es ist immer noch ein statistisches Spiel, aber mit einer geeigneten Speichertechnik und sicheren Passwörtern sollte jeder praktisch sehr sicher sein ...
Verschlüsseln Sie den Ausgabe-Hash vor der Speicherung
Im Sicherheitsbereich gibt es einen Algorithmus, der für alles ausgelegt ist, was wir oben gesagt haben. Es ist eine Blockchiffre. Es ist gut, weil es reversibel ist, so dass wir die Schlüssel drehen können (yay! Wartbarkeit!). Es ist gut, weil es wie geplant verwendet wird. Es ist gut, weil es dem Benutzer keine Informationen gibt.
Schauen wir uns diese Zeile noch einmal an. Angenommen, ein Angreifer kennt Ihren Algorithmus (der für die Sicherheit erforderlich ist, andernfalls für die Sicherheit durch Dunkelheit). Mit einem traditionellen Pfefferansatz kann der Angreifer ein Sentinel-Passwort erstellen, und da er das Salz und die Ausgabe kennt, kann er den Pfeffer brutal erzwingen. Ok, das ist ein langer Weg, aber es ist möglich. Mit einer Chiffre bekommt der Angreifer nichts. Und da das Salz zufällig ausgewählt wurde, hilft ihm ein Sentinel-Passwort nicht einmal. Das Beste, was ihnen bleibt, ist, das verschlüsselte Formular anzugreifen. Dies bedeutet, dass sie zuerst Ihren verschlüsselten Hash angreifen müssen, um den Verschlüsselungsschlüssel wiederherzustellen, und dann die Hashes angreifen müssen. Aber es gibt eine Menge Forschung zum Angriff auf Chiffren, deshalb wollen wir uns darauf verlassen.
TL / DR
Verwenden Sie keine Paprika. Es gibt eine Vielzahl von Problemen mit ihnen, und es gibt zwei bessere Möglichkeiten: kein serverseitiges Geheimnis zu verwenden (ja, es ist in Ordnung) und den Ausgabe-Hash vor dem Speichern mit einer Blockverschlüsselung zu verschlüsseln.
quelle
Zunächst sollten wir über den genauen Vorteil eines Pfeffers sprechen :
Ein typisches Szenario wäre SQL-Injection, weggeworfene Backups, verworfene Server ... Diese Situationen sind nicht so ungewöhnlich wie es sich anhört und oft nicht unter Ihrer Kontrolle (Server-Hosting). Wenn du benutzt...
... starke Passwörter sind gut geschützt. Unter diesen Bedingungen ist es fast unmöglich, ein sicheres Passwort zu erzwingen, selbst wenn das Salz bekannt ist. Das Problem sind die schwachen Passwörter, die Teil eines Brute-Force-Wörterbuchs sind oder Ableitungen davon sind. Bei einem Wörterbuchangriff werden diese sehr schnell angezeigt, da Sie nur die gängigsten Kennwörter testen.
Die zweite Frage ist, wie man den Pfeffer aufträgt.
Eine häufig empfohlene Methode zum Anwenden eines Pfeffers besteht darin, das Kennwort und den Pfeffer zu kombinieren, bevor Sie ihn an die Hash-Funktion übergeben:
Es gibt aber noch einen noch besseren Weg:
Dies ermöglicht nicht nur das Hinzufügen eines serverseitigen Geheimnisses, sondern auch den Austausch des $ serverSideKey, falls dies erforderlich sein sollte. Diese Methode erfordert etwas mehr Arbeit, aber wenn der Code einmal vorhanden ist (Bibliothek), gibt es keinen Grund, ihn nicht zu verwenden.
quelle
AES_ENCRYPT($passwordHash, $serverSideKey)
Aufruf auch eine geeignete Möglichkeit, dies zu implementieren?Der Sinn von Salz und Pfeffer besteht darin, die Kosten für eine vorberechnete Passwortsuche zu erhöhen, die als Regenbogentabelle bezeichnet wird.
Im Allgemeinen ist es schwierig, eine Kollision für einen einzelnen Hash zu finden (vorausgesetzt, der Hash ist sicher). Mit kurzen Hashes ist es jedoch möglich, mithilfe des Computers alle möglichen Hashes für eine Suche auf einer Festplatte zu generieren. Dies wird als Regenbogentisch bezeichnet. Wenn Sie eine Regenbogentabelle erstellen, können Sie in die Welt hinausgehen und schnell plausible Passwörter für jeden (ungesalzenen, nicht gepfefferten) Hash finden.
Der Sinn eines Pfeffers besteht darin, die Regenbogentabelle, die zum Hacken Ihrer Passwortliste benötigt wird, eindeutig zu machen. Dadurch wird mehr Zeit für den Angreifer verschwendet, um den Regenbogentisch zu konstruieren.
Der Sinn des Salzes besteht jedoch darin, die Regenbogentabelle für jeden Benutzer für den Benutzer eindeutig zu machen, was die Komplexität des Angriffs weiter erhöht.
In Wirklichkeit geht es bei der Computersicherheit fast nie darum, es (mathematisch) unmöglich zu machen, sondern nur mathematisch und physikalisch unpraktisch (zum Beispiel in sicheren Systemen würde die gesamte Entropie im Universum (und mehr) benötigt, um das Passwort eines einzelnen Benutzers zu berechnen).
quelle
root
auf unseren Datenbankserver gelangen , haben Sie immer noch keinen Zugriff auf unseren Anwendungsserver), die Pfeffer im Quellcode verstecken (in unsere Konfigurationsdatei) würde zusätzliche Sicherheit bieten.Das Speichern eines fest codierten Werts in Ihrem Quellcode kann nicht als sicherheitsrelevant angesehen werden. Es ist Sicherheit durch Dunkelheit.
Wenn ein Hacker Ihre Datenbank erwirbt, kann er Ihre Benutzerkennwörter brutal erzwingen. Es wird nicht lange dauern, bis dieser Hacker Ihren Pfeffer identifiziert, wenn er es schafft, ein paar Passwörter zu knacken.
quelle