Ich habe ein paar Mal gelesen, dass es beim Speichern von Passwörtern ratsam ist, die Zeichenfolgen zu "hacken" (z. B. mit md5 und dann sha1, beide natürlich mit salt).
Ich denke die erste Frage ist: "Ist das wirklich richtig?" Wenn nicht, dann entlassen Sie bitte den Rest dieser Frage :)
Der Grund, den ich frage, ist, dass ich auf den ersten Blick sagen würde, dass dies Sinn macht. Wenn ich jedoch darüber nachdenke, kann ich jedes Mal, wenn ein Hash aufbereitet wird (möglicherweise mit etwas, das hinzugefügt wird), nur sehen, dass die obere Grenze der endgültigen 'Einzigartigkeit' verringert wird ... diese Grenze hängt damit zusammen die anfängliche Eingabe.
Lassen Sie es mich anders sagen: Wir haben x Zeichenfolgen, die, wenn sie gehasht werden, auf y mögliche Zeichenfolgen reduziert werden. Das heißt, es gibt Kollisionen im ersten Satz. Kommt es nun von der zweiten zur dritten Menge, ist es nicht möglich, dass dasselbe auftritt (dh Kollisionen in der Menge aller möglichen 'y'-Strings, die im dritten Satz zum selben Hash führen)?
In meinem Kopf sehe ich nur einen 'Trichter' für jeden Hash-Funktionsaufruf, ein 'Trichter' einer unendlichen Menge von Möglichkeiten in eine endliche Menge und so weiter, aber offensichtlich arbeitet jeder Aufruf an der endlichen Menge davor und gibt uns eine Stellen Sie nicht größer als die Eingabe ein.
Vielleicht erklärt ein Beispiel mein Geschwafel? Nehmen Sie "hash_function_a", das "a" und "b" den Hash "1" und "c" und "d" den Hash "2" gibt. Wenn ich diese Funktion zum Speichern von Passwörtern verwende, könnte ich das Passwort 'b' verwenden, auch wenn das Passwort 'a' ist.
Nimm 'hash_function_b', das '1' und '2' den Hash '3' gibt. Wenn ich es als "sekundären Hash" nach "hash_function_a" verwenden würde, könnte ich auch dann "b", "c" oder "d" verwenden, wenn das Passwort "a" ist.
Hinzu kommt, dass Salze verwendet werden sollten, aber sie ändern nicht wirklich die Tatsache, dass jedes Mal, wenn wir 'x' Eingänge auf 'weniger als x' Ausgänge abbilden. Ich glaube nicht
Kann mir bitte jemand erklären, was ich hier vermisse?
Vielen Dank!
EDIT: für was es wert ist, mache ich das nicht selbst, ich benutze bcrypt. Und ich bin nicht wirklich besorgt darüber, ob es nützlich ist, Zyklen für einen „Hacker“ zu verbrauchen oder nicht. Aufrichtig frage ich mich nur, ob der Prozess die "Sicherheit" in Bezug auf Hash-Kollisionen verringert oder nicht.
MD5(password)
. Wir sagten, es sei nicht sicher, also schlugen sie vor,MD5(MD5(password))
stattdessen ...Antworten:
Dies ist besser für security.stackexchange geeignet, aber ...
Das Problem mit
ist, dass dies nur so stark ist wie die schwächste Hash-Funktion in der Kette. Wenn beispielsweise Hashn (der innerste Hash) eine Kollision verursacht, verursacht die gesamte Hash-Kette eine Kollision ( unabhängig davon, welche anderen Hashes in der Kette enthalten sind ).
Eine stärkere Kette wäre
Hier vermeiden wir das frühe Kollisionsproblem und generieren im Wesentlichen ein Salt, das vom Passwort für den letzten Hash abhängt.
Und wenn ein Schritt in der Kette kollidiert, spielt es keine Rolle, denn im nächsten Schritt wird das Passwort erneut verwendet und sollte für verschiedene Passwörter ein anderes Ergebnis liefern.
quelle
Die Verwendung verschiedener Hashing-Algorithmen ist eine schlechte Idee - sie wird die Entropie eher verringern als erhöhen.
Unter der Annahme, dass Sie einen kryptografisch starken Hashing-Algorithmus und ein gutes Salt haben, wird der Hashing-Prozess durch mehrmaliges Anwenden derselben Hash-Funktion rechenintensiver. Dies hat den Vorteil, dass der Angreifer beim Fehlschlagen anderer Methoden zum Knacken des Passwort-Hashs (Raten, Wörterbuchangriffe, Regenbogentabellen usw.) und beim Erzwingen von Brute-Force-Techniken länger braucht, um jedes Passwort zu testen, und zwar einfach deswegen Sie müssen die gleiche Hash-Funktion häufiger anwenden. Wenn also eine Runde Hashing einen Monat Brute-Forcing erfordern würde, würde sich die geschätzte Zeit durch zwölfmaliges Anwenden auf ein Jahr erhöhen.
Neuere Hashalgorithmen wie bcrypt bauen auf dieser Idee auf. Sie enthalten einen Parameter zur Steuerung der Rechenkomplexität des Hashs, sodass Sie ihn mit fortschreitender Hardware-Geschwindigkeit skalieren können: Wenn die Hardware um den Faktor zwei schneller wird, erhöhen Sie die zu kompensierende Komplexität und damit die Zeit, die erforderlich ist, um Ihren Hash zu brachialisieren Hashes bleiben in etwa konstant.
quelle
Versuchen Sie nicht, ein eigenes Kennwort-Hashing-Schema zu erstellen, es sei denn, Sie sind bereit, einen Kurs in Kryptografie und / oder Sicherheitstechnik zu belegen.
Sie sollten eine gut etablierte Implementierung von Passwort-Hashing verwenden, die wiederum eine Schlüsselableitungsfunktion ( KDF ) wie PBKDF2, bcrypt, scrypt oder das neuere Argon2 verwenden sollte.
Gute KDFs enthalten einen Arbeitsfaktor, in der Regel mehrere Iterationen, um die Kosten für Offline-Angriffe zu erhöhen. Man könnte sagen, dass diese KDFs das Passwort mehrfach hashen, wobei jedes Mal derselbe Algorithmus verwendet wird. Es hat keinen Sinn, einen Mehrfachnachrichten-Digest-Algorithmus zu verwenden, wie andere darauf hingewiesen haben.
quelle
Im Allgemeinen müssen Sie nicht mehr als einen Hashalgorithmus verwenden.
Was Sie tun müssen, ist:
Verwenden Sie Salt: Salt wird nicht nur verwendet, um Ihr Passwort sicherer zu machen , sondern auch, um Regenbogenangriffe zu vermeiden. Auf diese Weise wird es jemandem schwerer fallen, den Hash für die in Ihrem System gespeicherten Passwörter vorab zu berechnen.
Verwenden Sie mehrere Interaktionen: Anstatt nur SHA (Passwort + Salt) auszuführen, müssen Sie SHA (SHA (SHA (SHA (... SHA (Passwort + Salt))))) ausführen. Oder auf andere Weise darstellen:
Und schließlich wählen Sie eine gute Hashing-Funktion. SHA, MD5 usw. sind nicht gut, weil sie zu schnell sind . Da Sie Hash zum Schutz verwenden möchten, sollten Sie langsamere Hashes verwenden. Schauen Sie sich zum Beispiel Bcrypt , PBKDF2 oder Scrypt an.
Bearbeiten : Lassen Sie uns nach den Beobachtungen versuchen, einige Punkte zu sehen (Entschuldigung, lange Erklärungen, um zum Ende zu gelangen, da dies anderen helfen könnte, nach ähnlichen Antworten zu suchen):
Wenn Ihr System sicher ist und niemand jemals Zugriff auf das gespeicherte Kennwort erhalten wird, benötigen Sie keinen Hash. Das Passwort wäre geheim, niemand würde es bekommen.
Aber niemand kann versichern, dass die Datenbank mit den Passwörtern gestohlen wird. Stehlen Sie die Datenbank, haben Sie alle Passwörter. Ok, Ihr System und Ihre Firma werden alle Konsequenzen davon haben. Wir könnten also versuchen, dieses Passwortleck zu vermeiden.
HINWEIS, dass wir uns in diesem Punkt keine Sorgen über Online-Angriffe machen. Für einen Online-Angriff ist es die beste Lösung, nach schlechten Passwörtern langsamer zu werden, das Konto nach einigen Versuchen zu sperren usw. Dabei spielt es keine Rolle, wie Sie Ihr Passwort verschlüsseln, hashen, speichern usw. Bei einem Online-Angriff werden die Kennworteingaben verlangsamt .
Also zurück zum
don't let them take my plain passwords
Problem. Die Antwort ist einfach: Speichern Sie sie nicht als Klartext. OK habe es.Wie vermeide ich das?
Verschlüsseln Sie das Passwort (?). Aber wie Sie wissen, können Sie es, wenn Sie es verschlüsseln, wieder entschlüsseln, wenn Sie den richtigen Schlüssel haben. Und Sie werden am Ende das Problem haben, wo Sie den Schlüssel verstecken müssen. Hum, nicht gut, da sie Ihre Datenbank haben, können sie Ihren Schlüssel bekommen. Ok, lass es uns nicht benutzen.
Also ein anderer Ansatz: Lassen Sie uns das Passwort in etwas anderes verwandeln, das nicht rückgängig gemacht werden kann, und es speichern. Um zu überprüfen, ob das angegebene Passwort korrekt ist, führen wir den gleichen Vorgang erneut durch und prüfen, ob die beiden transformierten Werte übereinstimmen. Wenn sie übereinstimmen = wurde das richtige Passwort angegeben.
Ok, soweit so gut. Verwenden wir einen MD5-Hash im Passwort. Aber ... wenn jemand unseren gespeicherten Hash-Wert des Passworts hat, kann er viel Computerleistung haben, um den MD5-Hash jedes möglichen Passworts (Brute Force) zu berechnen, so dass er das ursprüngliche Passwort finden kann. Oder, schlimmstenfalls, er kann alle MD5 aus allen Zeichenkombinationen speichern und das Passwort leicht finden. Also mache viele Iterationen, die HASH (HASH (HASH ())) Sache, um es schwieriger zu machen, weil es mehr Zeit braucht.
Aber auch das kann umgangen werden, der Regenbogentisch wurde genau dafür geschaffen, diesen Schutz zu beschleunigen.
Lassen Sie uns etwas Salz darüber geben. Auf diese Weise wird das Salz bei jeder Wechselwirkung erneut verwendet. Wenn Sie versuchen, Ihre Passwörter anzugreifen, müssen Sie die Regenbogentabelle generieren, wobei berücksichtigt wird, dass das Salz jedes Mal hinzugefügt wird. Und wenn er diese Regenbogentabelle erzeugt, muss er, da sie mit einem Salz erzeugt wurde, erneut mit dem anderen Salz rechnen, sodass er für jedes Passwort (= jedes Salz) etwas Zeit aufwenden muss. Salt fügt dem Passwort keine "größere Komplexität" hinzu. Der Angreifer verliert nur Zeit beim Generieren der Regenbogentabelle. Wenn Sie für jedes Passwort ein Salt verwenden, ist die Tabelle von einem Salt für ein anderes Passwort unbrauchbar.
Und die Verwendung von mehr als einem Hash hat hier geholfen? Nein. Die Person, die einen bestimmten Regenbogenangriff erzeugt, kann diesen ohnehin mit einem oder mehreren Hashes erzeugen.
Die Verwendung von mehr als einem Hash kann zu einem Problem führen: Es ist so sicher wie der schwächste Hash, den Sie verwenden. Wenn jemand in einem Hash-Algorithmus Kollisionen findet, wird dieser Hash zu jedem Zeitpunkt des Iterationsprozesses ausgenutzt, um das Kennwort zu knacken. Wenn Sie also mehr Hash-Algorithmen verwenden, erhalten Sie nichts. Es ist besser, nur eine gute Algo auszuwählen. und benutze es. Und wenn Sie jemals hören, dass es kaputt ist, überlegen Sie, wie Sie es in Ihrer Anwendung ändern werden.
Und warum sollten Sie bcrypt oder so etwas verwenden (Sie sagen, Sie verwenden es): weil der Angreifer mehr Zeit damit verbringen muss, die Tabellen zu generieren. Aus diesem Grund hilft es nicht, MD5 + wait (3 Sekunden) zu verwenden: Der Angriff ist ohnehin offline, sodass der Angreifer die Tabellen ohne die Verzögerung von 3 Sekunden erstellen kann.
quelle
Nach meinem Verständnis bedeutet die Verwendung mehrerer Hashing-Algorithmen, dass Regenbogentabellen besiegt werden . Die Verwendung eines guten Salzes funktioniert auch, aber ich denke, es ist eine zweite Schutzstufe.
quelle
Dies ist nicht sicherer. Sie verfügen jedoch über ein Identifikationsprotokoll, das auf mehreren Hash-Vorgängen mit derselben Funktion basiert.
Das geht so. Der gespeicherte Wert lautet in Computer A hash ^ n (pass). A fordert B zur Authentifizierung auf und gibt B die ganze Zahl n. B führt den Berechnungs-Hash ^ (n-1) durch (bestanden) und sendet ihn zurück an A.
Eine Prüfung, die hash (hash ^ (n-1) (bestanden)) == hash ^ n (bestanden). Wenn dies zutrifft, ist die Authentifizierung abgeschlossen. Aber dann gibt ein Speicher-Hash ^ (n-1) (bestanden) und die nächste Authentifizierung B n-1 anstelle von n.
Dies stellt sicher, dass das Passwort niemals unmissverständlich ausgetauscht wird, dass A niemals weiß, wie das Passwort lautet, und dass die Authentifizierung durch die Wiedergabe geschützt ist. Dies hat jedoch den Nachteil, dass ein Passwort mit einer begrenzten Lebensdauer erforderlich ist. Wenn n den Wert 2 erreicht, muss nach der Authentifizierung ein neues Passwort gewählt werden.
Eine weitere Verwendung mehrerer Hashes ist das Tool HMAC, um die Authentifizierung und Integrität einer Anfrage sicherzustellen. Weitere Informationen zu HMAC finden Sie unter http://en.wikipedia.org/wiki/HMAC .
In der realen Welt ist die Verwendung von Mehrfach-Hash meistens übertrieben. In deinem Fall scheint es so zu sein. Beachten Sie, dass bei Verwendung mehrerer Hash-Funktionen nicht alle die gleiche Entropie aufweisen, wodurch die Stärke des Hash verringert wird. Zum Beispiel hat md5 weniger Entropie als sha1, so dass die Verwendung von sha1 auf einem md5 die Stärke des Hash nicht verbessert. Die Stärke entspricht im Allgemeinen der Stärke der schwächeren Hash-Funktion.
quelle