Ist das zweimalige Hashing eines Passworts vor dem Speichern mehr oder weniger sicher als das einmalige Hashing?
Ich spreche davon:
$hashed_password = hash(hash($plaintext_password));
statt nur dieses:
$hashed_password = hash($plaintext_password);
Wenn es weniger sicher ist, können Sie eine gute Erklärung (oder einen Link zu einer) geben?
Macht die verwendete Hash-Funktion auch einen Unterschied? Macht es einen Unterschied, wenn Sie md5 und sha1 (zum Beispiel) mischen, anstatt dieselbe Hash-Funktion zu wiederholen?
Hinweis 1: Wenn ich "Double Hashing" sage, spreche ich davon, ein Passwort zweimal zu haschen, um es verdeckter zu machen. Ich spreche nicht über die Technik zum Auflösen von Kollisionen .
Anmerkung 2: Ich weiß, dass ich ein zufälliges Salz hinzufügen muss, um es wirklich sicher zu machen. Die Frage ist, ob zweimaliges Hashing mit demselben Algorithmus dem Hash hilft oder schadet.
quelle
Hash(password)
undHash(Hash(password))
sind ebenso unsicher. Beiden fehlt der Begriff der semantischen Sicherheit . Das heißt, die Ausgabe ist von zufällig zu unterscheiden. Zum BeispielMD5("password")
ist5f4dcc3b5aa765d61d8327deb882cf99
. Ich weiß, dass dies der MD5-Hash istpassword
, und er ist von zufällig zu unterscheiden. Stattdessen sollten Sie einen HMAC verwenden. Es ist nachweislich sicher und ein PRF.Antworten:
Das einmalige Hashing eines Passworts ist unsicher
Nein, mehrere Hashes sind nicht weniger sicher. Sie sind ein wesentlicher Bestandteil der sicheren Verwendung von Passwörtern.
Das Iterieren des Hash erhöht die Zeit, die ein Angreifer benötigt, um jedes Kennwort in seiner Kandidatenliste auszuprobieren. Sie können die Zeit, die benötigt wird, um ein Passwort anzugreifen, leicht von Stunden auf Jahre verlängern.
Eine einfache Iteration reicht nicht aus
Die bloße Verkettung der Hash-Ausgabe mit der Eingabe reicht aus Sicherheitsgründen nicht aus. Die Iteration sollte im Kontext eines Algorithmus erfolgen, der die Entropie des Passworts beibehält. Glücklicherweise gibt es mehrere veröffentlichte Algorithmen, die ausreichend geprüft wurden, um Vertrauen in ihr Design zu schaffen.
Ein guter Algorithmus zur Schlüsselableitung wie PBKDF2 fügt das Kennwort in jede Hashing-Runde ein und verringert so die Bedenken hinsichtlich Kollisionen bei der Hash-Ausgabe. PBKDF2 kann unverändert für die Kennwortauthentifizierung verwendet werden. Bcrypt folgt der Schlüsselableitung mit einem Verschlüsselungsschritt. Auf diese Weise muss ein Angreifer einen bekannten Klartextangriff ausführen, wenn ein schneller Weg zum Umkehren der Schlüsselableitung gefunden wird.
So brechen Sie ein Passwort
Gespeicherte Passwörter müssen vor einem Offline-Angriff geschützt werden. Wenn Passwörter nicht gesalzen sind, können sie durch einen vorberechneten Wörterbuchangriff (z. B. mithilfe einer Regenbogentabelle) beschädigt werden. Andernfalls muss der Angreifer Zeit aufwenden, um für jedes Kennwort einen Hash zu berechnen und festzustellen, ob er mit dem gespeicherten Hash übereinstimmt.
Nicht alle Passwörter sind gleich wahrscheinlich. Angreifer suchen möglicherweise ausführlich nach allen kurzen Passwörtern, wissen jedoch, dass ihre Chancen auf Brute-Force-Erfolg mit jedem weiteren Charakter stark sinken. Stattdessen verwenden sie eine geordnete Liste der wahrscheinlichsten Passwörter. Sie beginnen mit "password123" und gehen zu weniger häufig verwendeten Passwörtern über.
Nehmen wir an, eine Angreiferliste ist mit 10 Milliarden Kandidaten lang. Angenommen, ein Desktop-System kann 1 Million Hashes pro Sekunde berechnen. Der Angreifer kann ihre gesamte Liste in weniger als drei Stunden testen, wenn nur eine Iteration verwendet wird. Wenn jedoch nur 2000 Iterationen verwendet werden, erstreckt sich diese Zeit auf fast 8 Monate. Um einen anspruchsvolleren Angreifer zu besiegen, der beispielsweise ein Programm herunterladen kann, das die Leistung seiner GPU nutzen kann, benötigen Sie mehr Iterationen.
Wieviel ist genug?
Die Anzahl der zu verwendenden Iterationen ist ein Kompromiss zwischen Sicherheit und Benutzererfahrung. Spezialisierte Hardware, die von Angreifern verwendet werden kann, ist billig, kann aber dennoch Hunderte Millionen Iterationen pro Sekunde ausführen. Die Leistung des Systems des Angreifers bestimmt, wie lange es dauert, ein Kennwort bei einer Reihe von Iterationen zu brechen. Es ist jedoch unwahrscheinlich, dass Ihre Anwendung diese spezielle Hardware verwendet. Wie viele Iterationen Sie ausführen können, ohne die Benutzer zu belasten, hängt von Ihrem System ab.
Sie können Benutzer wahrscheinlich eine zusätzliche ¾ Sekunde oder so während der Authentifizierung warten lassen. Profilieren Sie Ihre Zielplattform und verwenden Sie so viele Iterationen, wie Sie sich leisten können. Von mir getestete Plattformen (ein Benutzer auf einem mobilen Gerät oder viele Benutzer auf einer Serverplattform) können PBKDF2 mit 60.000 bis 120.000 Iterationen oder bcrypt mit einem Kostenfaktor von 12 oder 13 bequem unterstützen .
Mehr Hintergrund
In PKCS # 5 finden Sie maßgebliche Informationen zur Rolle von Salt und Iterationen beim Hashing. Obwohl PBKDF2 zum Generieren von Verschlüsselungsschlüsseln aus Kennwörtern gedacht war, eignet es sich gut als Einweg-Hash für die Kennwortauthentifizierung. Jede Iteration von bcrypt ist teurer als ein SHA-2-Hash, sodass Sie weniger Iterationen verwenden können, aber die Idee ist dieselbe. Bcrypt geht auch einen Schritt über die meisten PBKDF2-basierten Lösungen hinaus, indem der abgeleitete Schlüssel zum Verschlüsseln eines bekannten Klartextes verwendet wird. Der resultierende Chiffretext wird zusammen mit einigen Metadaten als "Hash" gespeichert. Nichts hindert Sie jedoch daran, dasselbe mit PBKDF2 zu tun.
Hier sind andere Antworten, die ich zu diesem Thema geschrieben habe:
quelle
Für diejenigen, die sagen, dass es sicher ist, sind sie im Allgemeinen korrekt . "Double" -Hashing (oder die logische Erweiterung davon, Iteration einer Hash-Funktion) ist für ein bestimmtes Anliegen absolut sicher, wenn es richtig gemacht wird.
Für diejenigen, die sagen, dass es unsicher ist, sind sie in diesem Fall richtig . Der in der Frage angegebene Code ist unsicher. Sprechen wir darüber, warum:
Es gibt zwei grundlegende Eigenschaften einer Hash-Funktion, die uns Sorgen machen:
Pre-Image Resistance - Bei einem Hash
$h
sollte es schwierig sein, eine$m
solche Nachricht zu finden$h === hash($m)
Second-Pre-Bild Resistance - eine Meldung gegeben
$m1
, sollte es schwierig sein , eine andere Botschaft zu finden ,$m2
so dasshash($m1) === hash($m2)
Kollisionsresistenz - Es sollte schwierig sein, ein Nachrichtenpaar
($m1, $m2)
so zu finden, dasshash($m1) === hash($m2)
(beachten Sie, dass dies dem Widerstand vor dem zweiten Bild ähnelt, sich jedoch darin unterscheidet, dass der Angreifer hier die Kontrolle über beide Nachrichten hat) ...Für die Speicherung von Passwörtern ist alles, was uns wirklich wichtig ist, die Pre-Image-Resistenz . Die anderen beiden wären umstritten, da
$m1
es sich um das Passwort des Benutzers handelt, das wir schützen möchten . Wenn der Angreifer es also bereits hat, hat der Hash nichts zu schützen ...HAFTUNGSAUSSCHLUSS
Alles, was folgt, basiert auf der Prämisse, dass uns nur die Pre-Image-Resistenz wichtig ist . Die beiden anderen grundlegenden Eigenschaften von Hash-Funktionen halten sich möglicherweise nicht (und normalerweise auch nicht) auf die gleiche Weise. Die Schlussfolgerungen in diesem Beitrag gelten daher nur, wenn Hash-Funktionen zum Speichern von Passwörtern verwendet werden. Sie sind im Allgemeinen nicht anwendbar ...
Lass uns anfangen
Lassen Sie uns für diese Diskussion unsere eigene Hash-Funktion erfinden:
Jetzt sollte es ziemlich offensichtlich sein, was diese Hash-Funktion bewirkt. Es summiert die ASCII-Werte jedes Eingabezeichens und nimmt dann das Modulo dieses Ergebnisses mit 256.
Testen wir es also:
Nun wollen wir sehen, was passiert, wenn wir es einige Male um eine Funktion herum ausführen:
Das gibt aus:
Hm, wow. Wir haben Kollisionen erzeugt !!! Versuchen wir herauszufinden, warum:
Hier ist die Ausgabe des Hashens einer Zeichenfolge jeder möglichen Hash-Ausgabe:
Beachten Sie die Tendenz zu höheren Zahlen. Das stellt sich als unser Tod heraus. Wenn Sie den Hash viermal ausführen ($ hash = ourHash ($ hash) `für jedes Element), erhalten Sie Folgendes:
Wir haben uns verengte bis 8 Werte nach unten ... Das ist schlecht ... Unsere ursprüngliche Funktion abgebildet
S(∞)
aufS(256)
. Das heißt, wir haben eine Zuordnung der Surjektivfunktion$input
zu erstellt$output
.Da wir eine Surjektivfunktion haben, können wir nicht garantieren, dass die Zuordnung für eine Teilmenge der Eingabe keine Kollisionen aufweist (in der Praxis sogar).
Das ist hier passiert! Unsere Funktion war schlecht, aber deshalb hat das nicht funktioniert (deshalb hat es so schnell und so vollständig funktioniert).
Das gleiche passiert mit
MD5
. Es wirdS(∞)
auf abgebildetS(2^128)
. Da gibt es keine Garantie , dass das LaufenMD5(S(output))
wird Injektive , was bedeutet , dass es nicht Kollisionen haben.TL / DR-Abschnitt
Da die
md5
direkte Rückkopplung der Ausgabe Kollisionen erzeugen kann, erhöht jede Iteration die Wahrscheinlichkeit von Kollisionen. Dies ist jedoch ein linearer Anstieg, was bedeutet, dass die Ergebnismenge2^128
zwar reduziert wird, aber nicht schnell genug signifikant reduziert wird, um ein kritischer Fehler zu sein.So,
Je öfter Sie iterieren, desto weiter geht die Reduzierung.
Die Reparatur
Zum Glück gibt es eine triviale Möglichkeit, dies zu beheben: Geben Sie etwas in die weiteren Iterationen zurück:
Beachten Sie, dass die weiteren Iterationen nicht 2 ^ 128 für jeden einzelnen Wert für sind
$input
. Dies bedeutet, dass wir möglicherweise$input
Werte generieren können, die auf der ganzen Linie immer noch kollidieren (und sich daher bei weit weniger als2^128
möglichen Ausgängen niederlassen oder mitschwingen ). Aber das allgemeine Argument für$input
ist immer noch so stark wie für eine einzelne Runde.Warten Sie, war es? Lassen Sie uns dies mit unserer
ourHash()
Funktion testen . Umschalten auf$hash = ourHash($input . $hash);
für 100 Iterationen:Es gibt dort immer noch ein grobes Muster, aber beachten Sie, dass es nicht mehr ein Muster ist als unsere zugrunde liegende Funktion (die bereits ziemlich schwach war).
Beachten Sie jedoch, dass
0
und3
Kollisionen wurden, obwohl sie nicht im einzigen Lauf waren. Dies ist eine Anwendung dessen, was ich zuvor gesagt habe (dass der Kollisionswiderstand für alle Eingaben gleich bleibt, sich jedoch aufgrund von Fehlern im zugrunde liegenden Algorithmus bestimmte Kollisionsrouten öffnen können).TL / DR-Abschnitt
Indem wir die Eingabe in jede Iteration zurückkoppeln, brechen wir effektiv alle Kollisionen, die in der vorherigen Iteration aufgetreten sind.
Daher
md5($input . md5($input));
sollte ( theoretisch mindestens) so stark sein wiemd5($input)
.Ist das wichtig?
Ja. Dies ist einer der Gründe, warum PBKDF2 PBKDF1 in RFC 2898 ersetzt hat . Betrachten Sie die inneren Schleifen der beiden ::
PBKDF1:
Wo
c
ist die Iterationszahl,P
ist das Passwort undS
ist das SalzPBKDF2:
Wo PRF wirklich nur ein HMAC ist. Aber für unsere Zwecke hier sagen wir einfach das
PRF(P, S) = Hash(P || S)
(das heißt, der PRF von 2 Eingängen ist ungefähr der gleiche wie der Hash mit den beiden miteinander verketteten). Es ist sehr viel nicht , aber für unsere Zwecke ist es.PBKDF2 behält also die Kollisionsbeständigkeit der zugrunde liegenden
Hash
Funktion bei, während PBKDF1 dies nicht tut.Alles zusammenbinden:
Wir kennen sichere Möglichkeiten, einen Hash zu iterieren. Eigentlich:
Ist normalerweise sicher.
Um nun zu untersuchen, warum wir es haschen möchten, analysieren wir die Entropiebewegung.
Ein Hash nimmt die unendliche Menge auf:
S(∞)
und erzeugt eine kleinere Menge mit gleichbleibender GrößeS(n)
. Die nächste Iteration (vorausgesetzt, die Eingabe wird zurückgegeben)S(∞)
wirdS(n)
erneut zugeordnet:Beachten Sie, dass die endgültige Ausgabe genau die gleiche Entropie aufweist wie die erste . Durch Iterieren wird es nicht " dunkler ". Die Entropie ist identisch. Es gibt keine magische Quelle für Unvorhersehbarkeit (es ist eine Pseudozufallsfunktion, keine Zufallsfunktion).
Das Iterieren hat jedoch einen Vorteil. Es macht den Hashing-Prozess künstlich langsamer. Und deshalb kann das Iterieren eine gute Idee sein. Tatsächlich ist es das Grundprinzip der meisten modernen Passwort-Hashing-Algorithmen (die Tatsache, dass immer wieder etwas langsamer wird).
Langsam ist gut, weil es die primäre Sicherheitsbedrohung bekämpft: Brute Forcing. Je langsamer wir unseren Hashing-Algorithmus machen, desto schwerer müssen Angreifer arbeiten, um uns gestohlene Passwort-Hashes anzugreifen. Und das ist gut so !!!
quelle
$output = md5($output); // < 2^128 possibilities
--- ist es wirklich streng<
oder<=
?md5()
in diesem Fall), um wirklich sicher zu sein. Aber im Allgemeinen wird es so sein<
und nicht<=
... Denken Sie daran, wir sprechen über die Größe des Satzes$output
für alle möglichen$inputs
. Wenn wir also auch nur eine Kollision haben<
,<
ist dies der bessere Generalisierer.Ja, erneutes Hashing reduziert den Suchraum, aber nein, das spielt keine Rolle - die effektive Reduzierung ist unbedeutend.
Re-Hashing erhöht die Zeit, die für Brute-Force benötigt wird, aber nur zweimal ist auch nicht optimal.
Was Sie wirklich wollen, ist das Hash-Passwort mit PBKDF2 - eine bewährte Methode zur Verwendung eines sicheren Hashs mit Salt und Iterationen. Schauen Sie sich diese SO-Antwort an .
EDIT : Ich hätte fast vergessen - NICHT MD5 VERWENDEN !!!! Verwenden Sie einen modernen kryptografischen Hash wie die SHA-2-Familie (SHA-256, SHA-384 und SHA-512).
quelle
Ja - es reduziert die Anzahl der möglichen Zeichenfolgen, die mit der Zeichenfolge übereinstimmen.
Wie Sie bereits erwähnt haben, sind gesalzene Hashes viel besser.
Ein Artikel hier: http://websecurity.ro/blog/2007/11/02/md5md5-vs-md5/ versucht einen Beweis dafür, warum es gleichwertig ist, aber ich bin mir mit der Logik nicht sicher. Teilweise gehen sie davon aus, dass keine Software zur Analyse von md5 (md5 (Text)) verfügbar ist, aber es ist offensichtlich ziemlich trivial, die Regenbogentabellen zu erstellen.
Ich halte immer noch an meiner Antwort fest, dass es weniger Hashes vom Typ md5 (md5 (Text)) als Hashes vom Typ md5 (Text) gibt, was die Wahrscheinlichkeit einer Kollision erhöht (auch wenn dies immer noch unwahrscheinlich ist) und den Suchraum verringert.
quelle
Die meisten Antworten stammen von Personen ohne kryptografischen oder sicherheitstechnischen Hintergrund. Und sie sind falsch. Verwenden Sie ein Salz, wenn möglich einmalig pro Datensatz. MD5 / SHA / etc sind zu schnell, das Gegenteil von dem, was Sie wollen. PBKDF2 und bcrypt sind langsamer (was gut ist), können aber mit ASICs / FPGA / GPUs besiegt werden (heutzutage sehr erschwinglich). Daher wird ein speicherintensiver Algorithmus benötigt: Geben Sie scrypt ein .
Hier ist eine Erklärung für Laien zu Salz und Geschwindigkeit (aber nicht zu speicherintensiven Algorithmen).
quelle
Ich betrachte dies nur von einem praktischen Standpunkt aus. Was ist der Hacker danach? Die Kombination von Zeichen, die beim Durchlaufen der Hash-Funktion den gewünschten Hash generiert.
Sie speichern nur den letzten Hash, daher muss der Hacker nur einen Hash bruteforce. Angenommen, Sie haben ungefähr die gleiche Wahrscheinlichkeit, bei jedem Bruteforce-Schritt über den gewünschten Hash zu stolpern, ist die Anzahl der Hashes irrelevant. Sie könnten eine Million Hash-Iterationen durchführen, und dies würde die Sicherheit nicht um ein Bit erhöhen oder verringern, da am Ende der Zeile immer noch nur ein Hash zu brechen ist und die Wahrscheinlichkeit, ihn zu brechen, die gleiche ist wie bei jedem Hash.
Vielleicht denken die vorherigen Poster, dass die Eingabe relevant ist; es ist nicht. Solange alles, was Sie in die Hash-Funktion eingeben, den gewünschten Hash generiert, werden Sie durch, korrekte Eingabe oder falsche Eingabe.
Jetzt sind Regenbogentische eine andere Geschichte. Da eine Regenbogentabelle nur unformatierte Passwörter enthält, kann zweimaliges Hashing eine gute Sicherheitsmaßnahme sein, da eine Regenbogentabelle, die jeden Hash jedes Hash enthält, zu groß wäre.
Natürlich betrachte ich nur das Beispiel, das das OP gegeben hat, bei dem es sich nur um ein Klartext-Passwort handelt, das gehasht wird. Wenn Sie den Benutzernamen oder ein Salt in den Hash aufnehmen, ist das eine andere Geschichte. zweimaliges Hashing ist völlig unnötig, da der Regenbogentisch bereits zu groß wäre, um praktisch zu sein und den richtigen Hash zu enthalten.
Jedenfalls kein Sicherheitsexperte hier, aber genau das habe ich aus meiner Erfahrung herausgefunden.
quelle
Nach dem, was ich gelesen habe, kann es tatsächlich empfohlen werden, das Passwort hunderte oder tausende Male neu zu hashen.
Die Idee ist, dass es für einen Angreifer mehr Arbeit ist, viele Vermutungen durchzugehen, um das Kennwort zu knacken, wenn Sie mehr Zeit für die Codierung des Kennworts benötigen. Dies scheint der Vorteil eines erneuten Hashings zu sein - nicht, dass es kryptografisch sicherer ist, aber es dauert einfach länger, einen Wörterbuchangriff zu generieren.
Natürlich werden Computer immer schneller, daher nimmt dieser Vorteil mit der Zeit ab (oder Sie müssen die Iterationen erhöhen).
quelle
Persönlich würde ich mich nicht mit mehreren Hashs beschäftigen, aber ich würde sicherstellen, dass auch der Benutzername (oder ein anderes Benutzer-ID-Feld) sowie das Kennwort gehasht werden, damit zwei Benutzer mit demselben Kennwort nicht denselben Hash erhalten. Außerdem würde ich wahrscheinlich auch eine andere konstante Zeichenfolge in die Eingabezeichenfolge werfen, um ein gutes Maß zu erreichen.
quelle
Nehmen wir an, Sie verwenden den Hashing-Algorithmus: Berechnen Sie rot13 und nehmen Sie die ersten 10 Zeichen. Wenn Sie dies zweimal (oder sogar 2000 Mal) tun, ist es möglich, eine Funktion zu erstellen, die schneller ist, aber das gleiche Ergebnis liefert (nämlich nur die ersten 10 Zeichen).
Ebenso kann es möglich sein, eine schnellere Funktion zu erstellen, die dieselbe Ausgabe wie eine wiederholte Hashing-Funktion liefert. Daher ist Ihre Wahl der Hashing-Funktion sehr wichtig: Wie beim Beispiel rot13 wird nicht angegeben, dass wiederholtes Hashing die Sicherheit verbessert. Wenn es keine Untersuchungen gibt, die besagen, dass der Algorithmus für die rekursive Verwendung ausgelegt ist, ist es sicherer anzunehmen, dass er Ihnen keinen zusätzlichen Schutz bietet.
Das heißt: Für alle außer den einfachsten Hashing-Funktionen sind höchstwahrscheinlich Kryptografie-Experten erforderlich, um die schnelleren Funktionen zu berechnen. Wenn Sie sich also vor Angreifern schützen, die keinen Zugriff auf Kryptografie-Experten haben, ist es in der Praxis wahrscheinlich sicherer, eine wiederholte Hashing-Funktion zu verwenden .
quelle
Im Allgemeinen bietet es keine zusätzliche Sicherheit, um etwas zu verdoppeln oder zu verschlüsseln. Wenn Sie den Hash einmal brechen können, können Sie ihn erneut brechen. Normalerweise schadet dies jedoch nicht der Sicherheit.
In Ihrem Beispiel für die Verwendung von MD5 gibt es, wie Sie wahrscheinlich wissen, einige Kollisionsprobleme. "Double Hashing" schützt nicht wirklich davor, da dieselben Kollisionen immer noch zu demselben ersten Hash führen, den Sie dann erneut mit MD5 abrufen können, um den zweiten Hash zu erhalten.
Dies schützt vor Wörterbuchangriffen wie diesen "Reverse MD5-Datenbanken", aber auch vor Salting.
Bei einer Tangente bietet die doppelte Verschlüsselung keine zusätzliche Sicherheit, da sie lediglich zu einem anderen Schlüssel führt, der eine Kombination der beiden tatsächlich verwendeten Schlüssel ist. Der Aufwand, den "Schlüssel" zu finden, wird also nicht verdoppelt, da zwei Schlüssel nicht gefunden werden müssen. Dies gilt nicht für Hashing, da das Ergebnis des Hash normalerweise nicht dieselbe Länge wie die ursprüngliche Eingabe hat.
quelle
Doppeltes Hashing ist für mich nur dann sinnvoll, wenn ich das Kennwort auf dem Client hashe und dann den Hash (mit unterschiedlichem Salz) dieses Hash auf dem Server speichere.
Auf diese Weise kann jemand, der sich in den Server gehackt hat (wodurch die von SSL bereitgestellte Sicherheit ignoriert wird), immer noch nicht an die eindeutigen Kennwörter gelangen.
Ja, er verfügt über die erforderlichen Daten, um in das System einzudringen, kann diese Daten jedoch nicht verwenden, um externe Konten des Benutzers zu gefährden. Und es ist bekannt, dass Menschen für praktisch alles dasselbe Passwort verwenden.
Der einzige Weg, um an die eindeutigen Passwörter zu gelangen, ist die Installation eines Keygens auf dem Client - und das ist nicht mehr Ihr Problem.
Also kurz gesagt:
quelle
Die Sorge um die Reduzierung des Suchraums ist mathematisch korrekt, obwohl der Suchraum groß genug bleibt, um für alle praktischen Zwecke (vorausgesetzt, Sie verwenden Salze) bei 2 ^ 128 zu liegen. Da es sich jedoch um Passwörter handelt, beträgt die Anzahl der möglichen Zeichenfolgen mit 16 Zeichen (alphanumerisch, Großbuchstaben, einige eingeworfene Symbole) nach meinen Berechnungen auf der Rückseite des Umschlags ungefähr 2 ^ 98. Die wahrgenommene Verringerung des Suchraums ist also nicht wirklich relevant.
Abgesehen davon gibt es kryptografisch gesehen wirklich keinen Unterschied.
Obwohl es ein Krypto-Grundelement gibt, das als "Hash-Kette" bezeichnet wird - eine Technik, mit der Sie einige coole Tricks ausführen können, z. B. die Offenlegung eines Signaturschlüssels nach seiner Verwendung, ohne die Integrität des Systems zu beeinträchtigen - bei minimaler Zeitsynchronisation ermöglicht es Ihnen, das Problem der anfänglichen Schlüsselverteilung sauber zu umgehen. Grundsätzlich berechnen Sie eine große Menge von Hashes von Hashes - h (h (h (h .... (h (k)) ...)). Verwenden Sie den n-ten Wert, um nach einem festgelegten Intervall, das Sie senden, zu signieren Ziehen Sie den Schlüssel heraus und signieren Sie ihn mit dem Schlüssel (n-1). Die Empfänger können jetzt überprüfen, ob Sie alle vorherigen Nachrichten gesendet haben, und niemand kann Ihre Unterschrift fälschen, seit der Zeitraum, für den sie gültig ist, abgelaufen ist.
Hunderttausende Male neu zu hashen, wie Bill vorschlägt, ist nur eine Verschwendung Ihrer CPU. Verwenden Sie einen längeren Schlüssel, wenn Sie sich Sorgen machen, dass Leute 128 Bit brechen.
quelle
Wie mehrere Antworten in diesem Artikel nahe legen, gibt es einige Fälle, in denen die Sicherheit verbessert werden kann, und andere, in denen dies definitiv schadet. Es gibt eine bessere Lösung, die die Sicherheit definitiv verbessert. Anstatt die Anzahl der Berechnungen des Hashs zu verdoppeln, die Größe Ihres Salzes zu verdoppeln oder die Anzahl der im Hash verwendeten Bits zu verdoppeln, oder beides! Springen Sie anstelle von SHA-245 zu SHA-512.
quelle
Double Hashing ist hässlich, da ein Angreifer höchstwahrscheinlich eine Tabelle erstellt hat, um die meisten Hashes zu erstellen. Besser ist es, die Hashes zu salzen und die Hashes miteinander zu mischen. Es gibt auch neue Schemata zum "Signieren" von Hashes (im Grunde Salzen), jedoch auf sicherere Weise.
quelle
Ja.
Absolut nicht mehr Iterationen einer herkömmlichen Hash - Funktion verwenden, wie
md5(md5(md5(password)))
. Im besten Fall erhalten Sie eine geringfügige Erhöhung der Sicherheit (ein solches Schema bietet kaum Schutz vor einem GPU-Angriff; leiten Sie ihn einfach weiter). Im schlimmsten Fall reduzieren Sie mit jeder hinzugefügten Iteration Ihren Hash-Speicherplatz (und damit die Sicherheit) . In Bezug auf die Sicherheit ist es ratsam, das Schlimmste anzunehmen.Sie verwenden ist ein Kennwort , das ist schon entworfen von einem kompetenten Kryptograph zu sein ein wirksames Passwort - Hash, und resistent gegen sowohl Brute-Force - und Raum - Zeit-Attacken. Dazu gehören bcrypt, scrypt und in einigen Situationen PBKDF2. Der glibc SHA-256-basierte Hash ist ebenfalls akzeptabel.
quelle
Ich werde mich auf die Beine stellen und sagen, dass es unter bestimmten Umständen sicherer ist ... aber stimmen Sie mich noch nicht ab!
Aus mathematischer / kryptografischer Sicht ist es weniger sicher, aus Gründen, von denen ich sicher bin, dass jemand anderes Ihnen eine klarere Erklärung geben wird, als ich könnte.
jedoch existieren große Datenbanken von MD5 - Hashes, die eher den „Passwort“ Text als die MD5 davon enthalten. Durch Double-Hashing verringern Sie also die Effektivität dieser Datenbanken.
Wenn Sie ein Salz verwenden, verschwindet dieser Vorteil (Nachteil?) Natürlich.
quelle