Ist es sicherer, ein Passwort mehrmals zu hacken?

43

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.

Narzisse
quelle
2
@ S.Lott: Ich verstehe nicht wirklich, wie das die eigentliche Frage beantwortet ... alles, was darin steht, ist entweder "Mach es nicht selbst, benutze dieses Ding" oder "Es ist gut, Zeit in Anspruch zu nehmen!". ..keine der beiden Antworten "ist es eigentlich sicherer". Nochmals, es sei denn, ich vermisse etwas.
Narzisse
@ MetalMikester: Ja, das war der gestrige Artikel: thedailywtf.com/Articles/Bulletproof-Encryption.aspx
FrustratedWithFormsDesigner
Für die IT-Sicherheit ist dies kein aktuelles Thema, aber für die Kryptografie scheint es eine gute Ergänzung zu sein. Tatsächlich sieht es dieser Frage dort sehr ähnlich .
Ich kenne eine Firma, die ungesalzen verwenden wollte MD5(password). Wir sagten, es sei nicht sicher, also schlugen sie vor, MD5(MD5(password))stattdessen ...
Konfigurator
Die akzeptierte Antwort ist nicht die richtige Antwort!
Markus

Antworten:

27

Dies ist besser für security.stackexchange geeignet, aber ...

Das Problem mit

hash1(hash2(hash3(...hashn(pass+salt)+salt)+salt)...)+salt)

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

hash1(hash2(hash3(...hashn(pass + salt) + pass + salt) + pass + salt)...) + pass + salt)

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.

Ratschenfreak
quelle
Im Moment sehe ich also, dass das Hinzufügen von "Passwort + Salz" als Salz für die nächste Runde des Hashens die Menge an "Zeug" erhöhen könnte, das in den Trichter gelangen könnte. Jetzt muss ich nur noch verstehen, um wie viel. Vielen Dank.
Narzisse
Eigentlich glaube ich, dass ich es jetzt verstehe: Durch das Erzwingen des Passworts in jede Ebene des Hashings wird die Anzahl möglicher Kollisionen tatsächlich reduziert, indem im Wesentlichen "das kollidierende Passwort" und das echte Passwort für jeden "Aufruf" übereinstimmende Hashes erforderlich sind. , richtig? Ich denke, dass mir der Teil "Gib das Passwort in jeder Ebene ein" gefehlt hat! Danke noch einmal.
Narzisse
@Narcissus Kein Problem und das hat auch den Bonus von schwächerem inneren Hashes ermöglicht (solange die äußeren / Abschluss Hashes stark ist) als die inneren Hash - Werte sind gerade , um das Salz für den nächsten Durchlauf
Ratsche Missgeburt
summen, ich denke, dass das Problem ein bisschen größer (und tiefer) ist. Bei Regenbogenangriffen können Sie nur Tabellen generieren, die alle Ihre Hashes berücksichtigen, und das Problem bleibt bestehen.
woliveirajr
4
@Narcissus: in einer sehr kurzen Antwort: Ja, es ist nicht mehr sicher. Ja, wahrscheinlich ist es noch weniger sicher.
woliveirajr
54

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.

tdammers
quelle
2
Das ist die richtige Antwort!
Markus
@markus: laut der Diskussion, die ich gelesen habe, ist dies nur aufgrund des Zusatzes "und eines guten Salzes" richtig, der von der akzeptierten Antwort angesprochen wird, nicht wahr? Warum ist diese richtig und die akzeptierte Antwort nicht?
Narzisse
Dies ist die richtige Antwort, da der einzige Grund für die mehrfache (parametrisierte) Anwendung derselben Hashing-Funktion darin besteht, dass Sie diese Iteration verwenden können, um eine schnellere Hardware einzustellen. Andernfalls hat das mehrfache Hashing keinen Vorteil.
Markus
@ Narzisse Der Schlüssel hier ist Entropie. Es gibt einen Unterschied zwischen dem mehrmaligen Hashing mit derselben Methode und dem mehrmaligen Hashing mit unterschiedlichen Methoden.
Sakisk
3

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.

Erwan Legrand
quelle
1
der link https://crackstation.net/hashing-security.htm wird von firewall
gnat
1
@gnat Aus irgendeinem Grund habe ich Ihren Kommentar zur blockierten URL verpasst. Ich habe es durch einen Link zu Wikipedia ersetzt.
Erwan Legrand
2

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:

hash = sha(password + salt)
for i=1 , i=5000, i++ {
    hash = sha(hash + salt);
}

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 passwordsProblem. 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.

woliveirajr
quelle
2
Hoppla! Entschuldigung, mein Kommentar (über das absichtliche Verlangsamen des Hashs über den Timeout-Parameter) sollte nicht ernst genommen werden ... Ich glaube, ich habe in letzter Zeit zu viel Dilbert gelesen.
FrustratedWithFormsDesigner
2
sha (sha (sha (...))) ist nicht sicherer als sha. Wenn die Entropie der sha-Funktion nicht maximal ist, ist dies tatsächlich weniger sicher.
Deadalnix
1
@deadalnix: Es ist wichtig zu erwähnen, dass es nicht einfacher ist, das ursprüngliche Passwort wiederherzustellen, sondern dass es einfacher ist, ein kollidierendes Passwort zu generieren, was alles ist, was erforderlich ist.
Bryan Boettcher
1
@deadalnix, ich habe diesen Kommentar mit der Stimme von Dale Gribble gelesen .
jiggy
1
@deadalnix: Das Ziel von sha (sha (sha ())) ist und war es nie, mehr Entropie hinzuzufügen. Entropie wird nur vom ersten Benutzer durchgeführt, der sein Passwort wählt. Alles andere (Hash, Salt usw.) dient nur dazu, einen Brute-Force-Angriff zu verlangsamen. Wenn jemand in der Lage ist, Ihre Datenbank mit den Passwörtern
abzurufen
-1

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.

jiggy
quelle
4
Nun, das ändert sich nicht so sehr. Die «multiple Hash» -Funktion kann als eine angesehen und als solche behandelt werden.
Deadalnix
2
Durch die Verwendung mehrerer Hashtechniken oder Iterationen werden Regenbogentabellen nicht besiegt. Wenn ein Angreifer über Ihre Datenbank verfügt und die Methode zum Generieren der Hashes verwendet, kann der Angreifer eine Regenbogentabelle generieren, um alle Kennwörter in der Datenbank anzugreifen. SALTS verhindern Regenbogentabellenangriffe, da der Angreifer kein einziges Nachschlagewörterbuch erstellen kann, um beispielsweise alle Passwörter mit maximal 8 Zeichen anzugreifen.
Erik
-1

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.

deadalnix
quelle