Welche kryptografische Hash-Funktion soll ich wählen?


137

Das .NET Framework wird mit 6 verschiedenen Hashing-Algorithmen geliefert:

  • MD5: 16 Bytes (Zeit bis zum Hash 500 MB: 1462 ms)
  • SHA-1: 20 Bytes (1644 ms)
  • SHA256: 32 Bytes (5618 ms)
  • SHA384: 48 Bytes (3839 ms)
  • SHA512: 64 Bytes (3820 ms)
  • RIPEMD: 20 Bytes (7066 ms)

Jede dieser Funktionen funktioniert anders. MD5 ist das schnellste und RIPEMD das langsamste.

MD5 hat den Vorteil, dass es in den eingebauten Guid-Typ passt. und es ist die Basis der Typ 3 UUID . SHA-1-Hash ist die Basis der UUID vom Typ 5. Das macht sie wirklich einfach zur Identifizierung zu verwenden.

MD5 ist jedoch anfällig für Kollisionsangriffe , SHA-1 ist ebenfalls anfällig, jedoch in geringerem Maße.

Unter welchen Bedingungen sollte ich welchen Hashing-Algorithmus verwenden?

Besondere Fragen, auf die ich sehr gespannt bin, sind:

  • Ist MD5 nicht vertrauenswürdig? Unter normalen Umständen, wenn Sie den MD5-Algorithmus ohne böswillige Absicht verwenden und kein Dritter böswillige Absichten hat, würden Sie JEDE Kollision erwarten (dh zwei beliebige Bytes [], die denselben Hash erzeugen).

  • Wie viel besser ist RIPEMD als SHA1? (wenn es besser ist) es ist 5 mal langsamer zu berechnen, aber die Hash-Größe ist die gleiche wie bei SHA1.

  • Wie hoch ist die Wahrscheinlichkeit, dass beim Hashing von Dateinamen (oder anderen kurzen Zeichenfolgen) nicht böswillige Kollisionen auftreten? (ZB 2 zufällige Dateinamen mit demselben MD5-Hash) (mit MD5 / SHA1 / SHA2xx) Wie hoch sind im Allgemeinen die Chancen für nicht böswillige Kollisionen?

Dies ist der Benchmark, den ich verwendet habe:

    static void TimeAction(string description, int iterations, Action func) {
        var watch = new Stopwatch();
        watch.Start();
        for (int i = 0; i < iterations; i++) {
            func();
        }
        watch.Stop();
        Console.Write(description);
        Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
    }

    static byte[] GetRandomBytes(int count) {
        var bytes = new byte[count];
        (new Random()).NextBytes(bytes);
        return bytes;
    }


    static void Main(string[] args) {

        var md5 = new MD5CryptoServiceProvider();
        var sha1 = new SHA1CryptoServiceProvider();
        var sha256 = new SHA256CryptoServiceProvider();
        var sha384 = new SHA384CryptoServiceProvider();
        var sha512 = new SHA512CryptoServiceProvider();
        var ripemd160 = new RIPEMD160Managed();

        var source = GetRandomBytes(1000 * 1024);

        var algorithms = new Dictionary<string,HashAlgorithm>();
        algorithms["md5"] = md5;
        algorithms["sha1"] = sha1;
        algorithms["sha256"] = sha256;
        algorithms["sha384"] = sha384;
        algorithms["sha512"] = sha512;
        algorithms["ripemd160"] = ripemd160;

        foreach (var pair in algorithms) {
            Console.WriteLine("Hash Length for {0} is {1}", 
                pair.Key, 
                pair.Value.ComputeHash(source).Length);
        }

        foreach (var pair in algorithms) {
            TimeAction(pair.Key + " calculation", 500, () =>
            {
                pair.Value.ComputeHash(source);
            });
        }

        Console.ReadKey();
    }

15
Die Tatsache, dass Sie erwähnen, dass md5 in das GUID-Format (16 Byte) passt, deutet auf ein grundlegendes Missverständnis hin. Es ist nicht garantiert, dass ein Hash eindeutig ist, aber er ist selten (und schwer zu fälschen, wenn er in einem kryptografischen Sinne verwendet wird) und wird von dem abgeleitet, von dem er ein Hash ist, während eine GUID eindeutig ist, aber nichts mit dem Inhalt des Hash zu tun hat was es identifiziert. Sie werden für sehr unterschiedliche Zwecke verwendet.
Barry Wark

1
Korrigieren Sie seine nicht verwandten, es ist nur eine praktische implementierungsspezifische Tatsache. Ich verstehe, dass Sie nicht unendlich in 16 Bytes passen können. Sie können Kollisionen mit jedem Hash-Algorithmus bekommen
Sam Saffron

5
Auch ein Guid ist in der Praxis nur einzigartig. Theoretisch würden Sie Duplikate erhalten, wenn Sie weiterhin Guids generieren würden.
Sam Saffron

3
Sie sollten wirklich keinen Hash in eine GUID stecken, auch wenn es passt. Einfachstes Beispiel: Zwei Kopien derselben Datei sollten unterschiedliche GUIDs, aber denselben Hash haben. Die ersten 8 Buchstaben des Namens einer Person passen auch ganz gut in 16 Bytes.
dbkk

2
@ user2332868 Das Brechen von SHA-1 hat keinen Einfluss auf die Wahrscheinlichkeit versehentlicher Kollisionen. Wenn eine böswillige Absicht eine Bedrohung für Ihre Nutzung darstellt, ist es meiner Meinung nach falsch, blind eine Hash-Funktion auszuwählen, und Sie müssen Zeit für die Risiko- / Kostenanalyse für Ihren speziellen Fall aufwenden.
Andrey Tarantsov

Antworten:


138

In der Kryptographie bieten Hash-Funktionen drei separate Funktionen.

  1. Kollisionsbeständigkeit : Wie schwer ist es für jemanden, zwei Nachrichten ( zwei beliebige Nachrichten) zu finden, die den gleichen Hash haben.
  2. Preimage Resistance : Wie schwierig ist es angesichts eines Hashs, eine andere Nachricht zu finden, die denselben Hash hat? Wird auch als Einweg-Hash-Funktion bezeichnet .
  3. Zweiter Widerstand vor dem Bild : Suchen Sie bei einer gegebenen Nachricht eine andere Nachricht, die dieselbe hasht.

Diese Eigenschaften sind verwandt, aber unabhängig. Zum Beispiel impliziert Kollisionsfestigkeit einen zweiten Vorbildwiderstand, aber nicht umgekehrt. Für jede Anwendung gelten unterschiedliche Anforderungen, für die eine oder mehrere dieser Eigenschaften erforderlich sind. Eine Hash-Funktion zum Sichern von Kennwörtern auf einem Server erfordert normalerweise nur einen Widerstand vor dem Bild, während für die Nachrichtenübersicht alle drei erforderlich sind.

Es hat sich gezeigt, dass MD5 nicht kollisionsfest ist, was jedoch seine Verwendung in Anwendungen, die keine Kollisionsfestigkeit erfordern, nicht ausschließt. In der Tat wird MD5 häufig noch in Anwendungen verwendet, bei denen die kleinere Schlüsselgröße und Geschwindigkeit von Vorteil sind. Aufgrund seiner Mängel empfehlen die Forscher jedoch die Verwendung anderer Hash-Funktionen in neuen Szenarien.

SHA1 hat einen Fehler, der es ermöglicht, Kollisionen in theoretisch weit weniger als den 2 ^ 80 Schritten zu finden, die eine sichere Hash-Funktion ihrer Länge erfordern würde. Der Angriff wird ständig überarbeitet und kann derzeit in ~ 2 ^ 63 Schritten ausgeführt werden - nur knapp im aktuellen Bereich der Berechenbarkeit. Aus diesem Grund stellt NIST die Verwendung von SHA1 ein und erklärt, dass die SHA2-Familie nach 2010 verwendet werden sollte.

SHA2 ist eine neue Familie von Hash-Funktionen, die nach SHA1 erstellt wurden. Derzeit sind keine Angriffe auf SHA2-Funktionen bekannt. SHA256, 384 und 512 gehören alle zur SHA2-Familie und verwenden nur unterschiedliche Schlüssellängen.

RIPEMD Ich kann nicht zu viel dazu sagen, außer dass es nicht so häufig verwendet wird wie die SHA-Familien und daher von kryptografischen Forschern nicht so genau untersucht wurde. Allein aus diesem Grund würde ich die Verwendung von SHA-Funktionen darüber empfehlen. In der Implementierung, die Sie verwenden, scheint es auch ziemlich langsam zu sein, was es weniger nützlich macht.

Zusammenfassend lässt sich sagen, dass es keine beste Funktion gibt - alles hängt davon ab, wofür Sie sie benötigen. Achten Sie bei jedem auf die Fehler, und Sie können am besten die richtige Hash-Funktion für Ihr Szenario auswählen .


1
Ich weiß es wirklich zu schätzen, dass Sie sich mit dieser Detailstufe befassen. Das ist sehr hilfreich.
Joel

1
Für einige Anwendungen ist möglicherweise sogar eine Hash-Funktion ohne Krypto-Qualität geeignet. Das OP erwähnte nie, ob es speziell für Passwörter oder für die Authentifizierung von Challenge-Response oder für Zugriffstoken oder nur zum Indizieren einer Reihe von Zeichenfolgen / Dateien gedacht war. Leistung hingegen ist ein Anliegen für die OP ...
Seva Alekseyev

111

Alle Hash-Funktionen sind "kaputt"

Das Pigeonhole-Prinzip besagt, dass Sie so viel wie möglich versuchen können, nicht mehr als 2 Tauben in 2 Löcher zu stecken (es sei denn, Sie schneiden die Tauben auf). Ebenso können Sie nicht 2 ^ 128 + 1 Zahlen in 2 ^ 128 Steckplätze einpassen. Alle Hash-Funktionen führen zu einem Hash endlicher Größe. Dies bedeutet, dass Sie immer eine Kollision finden können, wenn Sie nach Sequenzen mit "endlicher Größe" + 1 suchen. Das ist einfach nicht machbar. Nicht für MD5 und nicht für Skein .

MD5 / SHA1 / Sha2xx haben keine zufälligen Kollisionen

Alle Hash-Funktionen haben Kollisionen, das ist eine Tatsache des Lebens. Wenn Sie versehentlich auf diese Kollisionen stoßen, entspricht dies dem Gewinn der intergalaktischen Lotterie . Das heißt, niemand gewinnt die intergalaktische Lotterie , es ist einfach nicht die Art und Weise, wie die Lotterie funktioniert. Sie werden NIEMALS auf einen versehentlichen MD5 / SHA1 / SHA2XXX-Hash stoßen. Jedes Wort in jedem Wörterbuch, in jeder Sprache hat einen anderen Wert. Jeder Pfadname auf jeder Maschine auf dem gesamten Planeten hat einen anderen MD5 / SHA1 / SHA2XXX-Hash. Woher weiß ich das? Nun, wie ich bereits sagte, gewinnt niemand die intergalaktische Lotterie.

Aber ... MD5 ist kaputt

Manchmal spielt die Tatsache, dass es kaputt ist, keine Rolle .

Derzeit sind keine Pre-Image- oder Second-Pre-Image-Angriffe auf MD5 bekannt.

Also, was ist so kaputt an MD5, fragen Sie sich vielleicht? Es ist möglich, dass ein Dritter zwei Nachrichten generiert, von denen eine BÖSE und eine GUT ist und beide den gleichen Wert haben. ( Kollisionsangriff )

Die derzeitige RSA-Empfehlung lautet jedoch, MD5 nicht zu verwenden, wenn Sie einen Vorbildwiderstand benötigen. Menschen neigen dazu, bei Sicherheitsalgorithmen auf Nummer sicher zu gehen.

Welche Hash-Funktion sollte ich in .NET verwenden?

  • Verwenden Sie MD5, wenn Sie die Geschwindigkeit / Größe benötigen und sich nicht für Geburtstags- oder Pre-Image-Angriffe interessieren.

Wiederholen Sie dies nach mir, es gibt keine Möglichkeit, MD5-Kollisionen , böswillige Kollisionen können sorgfältig entwickelt werden. Obwohl bisher keine Pre-Image-Angriffe auf MD5 bekannt sind, ist die Aussage der Sicherheitsexperten, dass MD5 nicht dort eingesetzt werden sollte, wo Sie sich gegen Pre-Image-Angriffe verteidigen müssen. GLEICH gilt für SHA1 .

Beachten Sie, dass nicht alle Algorithmen vor Pre-Image- oder Kollisionsangriffen schützen müssen. Nehmen Sie den trivialen Fall einer ersten Suche nach doppelten Dateien auf Ihrer Festplatte.

  • Verwenden Sie die SHA2XX-basierte Funktion, wenn Sie eine kryptografisch sichere Hash-Funktion wünschen.

Niemand hat jemals eine SHA512-Kollision gefunden. JE. Sie haben sich wirklich sehr bemüht. Übrigens hat noch nie jemand eine SHA256- oder 384-Kollision gefunden. .

  • Verwenden Sie SHA1 oder RIPEMD nur für ein Interoperabilitätsszenario.

RIPMED hat nicht die gleiche Prüfung erhalten, die SHAX und MD5 erhalten haben. Sowohl SHA1 als auch RIPEMD sind anfällig für Geburtstagsangriffe. Sie sind beide langsamer als MD5 in .NET und haben die unangenehme Größe von 20 Byte. Es ist sinnlos, diese Funktionen zu verwenden, vergessen Sie sie.

SHA1-Kollisionsangriffe sind auf 2 ^ 52 reduziert, es wird nicht zu lange dauern, bis SHA1-Kollisionen in freier Wildbahn stattfinden.

Aktuelle Informationen zu den verschiedenen Hash-Funktionen finden Sie im Hash-Funktionszoo .

Aber warte, da ist noch mehr

Eine schnelle Hash-Funktion kann ein Fluch sein. Beispiel: Eine sehr häufige Verwendung für Hash-Funktionen ist die Kennwortspeicherung. Im Wesentlichen berechnen Sie den Hash eines Passworts in Kombination mit einer bekannten zufälligen Zeichenfolge (um Regenbogenangriffe zu verhindern) und speichern diesen Hash in der Datenbank.

Das Problem ist, dass ein Angreifer, wenn er einen Speicherauszug der Datenbank erhält, Kennwörter mithilfe von Brute-Force recht effektiv erraten kann. Jede Kombination, die er versucht, dauert nur einen Bruchteil einer Millisekunde, und er kann Hunderttausende von Passwörtern pro Sekunde ausprobieren.

Um dieses Problem zu umgehen , kann der bcrypt- Algorithmus verwendet werden. Er ist langsam ausgelegt, sodass der Angreifer beim Angriff auf ein System mit bcrypt stark verlangsamt wird. In letzter Zeit hat scrypt einige Schlagzeilen gemacht und wird von einigen als effektiver als bcrypt angesehen, aber ich kenne keine .Net-Implementierung.


Während sowohl MD5 als auch SHA-1 geschwächt wurden, ist MD5 viel schwächer als SHA-1, während es nur geringfügig schneller ist. Tatsächliche MD5-Kollisionen wurden gefunden und für reale Exploits (Fälschung von CA-Zertifikaten) verwendet, aber meines Wissens wurden keine tatsächlichen SHA-1-Kollisionen gefunden (obwohl die Anzahl der Operationen durch Brute-Force erheblich reduziert wurde). Und wenn man bedenkt, wie viel schwächer MD5 ist, wäre ich nicht überrascht, wenn zweite Vorbildangriffe für MD5 früher als für SHA-1 auftreten würden. Daher denke ich, dass Sie SHA-1 verwenden sollten, wenn Sie Geschwindigkeit und keine Kollisionsfestigkeit benötigen, und ansonsten eines aus der SHA-2-Familie verwenden sollten.
Brian Campbell

1
@Brian Es ist ziemlich klar, dass Menschen in den nächsten Jahren Kollisionsangriffe auf SHA1 ausführen können. Dies macht SHA1 effektiv so nützlich wie MD5. Das CA-Zertifikat ist ein Kollisionsangriff, ähnlich wie es in einigen Jahren möglich sein wird um denselben Angriff auf SHA1-CA-Zertifikate auszuführen. Der Angriff hängt davon ab, dass eine böswillige Partei ein EVIL- und ein GOOD-Zertifikat erstellt. Es sind keine Primage-Angriffe auf MD5 bekannt, und die Tatsache, dass es Kollisionsangriffe gibt, macht Pre-Image-Angriffe nicht mehr oder weniger wahrscheinlich.
Sam Saffron

Es geht weit weniger darum, welchen Hash Sie für Passwörter verwenden, als darum, was gehasht wird. Wenn Ihr Salt bekannt ist, ist Ihre Datenbank sofort anfällig für einen Wörterbuchangriff. Wenn Ihr Salt prozedural ist und Ihr Dateisystem kompromittiert ist, sind Sie (wieder) verwundbar. Wenn Ihr Salz weggelassen wird, sind Sie erneut gefährdet. Die fragliche Sicherheit ist, egal was passiert, WAS gehasht wird. Zertifikate werde ich nicht ansprechen, weil ich mich nicht als Programmierer damit befasst habe (IE, Erstellen, Verstehen usw.).
Robert K

Der Begriff gebrochen hat im Zusammenhang mit Hashing eine bestimmte Bedeutung, und es ist nicht die Bedeutung, auf die diese Antwort Wert legt. Diese Antwort wird nur Verwirrung stiften.
Joel McBeth

1
Dies ist eine ausgezeichnete Antwort, da sie sich auf die Praktikabilität konzentriert. Hashes werden nicht nur für Sicherheitszwecke verwendet (z. B. zum Generieren von Cache-Suchschlüsseln für nicht vertrauliche Daten oder zum Ermitteln, ob sich ein serialisiertes Objekt geändert hat). Die Chancen eines gezielten Angriffs sind praktisch Null (sagen Sie niemals nie), und selbst wenn ein Angriff erfolgreich wäre, hätte er keine wesentlichen Auswirkungen. Hervorragende Arbeit, die sich auf die praktischen (statt theoretischen) Auswirkungen konzentriert.
DVK

35

Aktualisieren:

Die Zeiten haben sich geändert, wir haben einen SHA3-Gewinner. Ich würde empfehlen, den Keccak- Gewinner (auch bekannt als SHA3 ) des SHA3-Wettbewerbs zu verwenden.

Ursprüngliche Antwort:

In der Reihenfolge der schwächsten bis stärksten würde ich sagen:

  1. RIPEMD BROKEN, sollte niemals verwendet werden, wie in diesem PDF zu sehen ist
  2. MD-5 BROKEN, sollte niemals verwendet werden, kann mit einem Laptop in 2 Minuten beschädigt werden
  3. SHA-1 BROKEN, sollte niemals verwendet werden, ist im Prinzip gebrochen, Angriffe werden von Woche zu Woche besser
  4. SHA-2 WEAK, wird wahrscheinlich in den nächsten Jahren kaputt sein. Es wurden einige Schwächen festgestellt. Beachten Sie, dass es im Allgemeinen umso schwieriger ist, die Hash-Funktion zu unterbrechen, je höher die Schlüsselgröße ist. Während Schlüsselgröße = Stärke nicht immer wahr ist, ist es meistens wahr. Daher ist SHA-256 wahrscheinlich schwächer als SHA-512.
  5. Skein NO KNOWN WEAKNESSES, ist ein Kandidat für SHA-3 . Es ist ziemlich neu und daher ungetestet. Es wurde in einer Reihe von Sprachen implementiert.
  6. MD6 NO KNOWN WEAKNESSES, ist ein weiterer Kandidat für SHA-3. Wahrscheinlich stärker als Skien, aber auf Single-Core-Maschinen langsamer. Wie Skien ist es ungetestet. Einige sicherheitsbewusste Entwickler verwenden es in geschäftskritischen Rollen .

Persönlich würde ich MD6 verwenden, weil man nie zu paranoid sein kann. Wenn Geschwindigkeit ein echtes Problem ist, würde ich mir Skein oder SHA-256 ansehen.


5
Ich würde Skein und MD6 nicht so weit oben auf die Liste setzen. Es gibt einen Grund, warum der SHA-3-Wettbewerb erst Ende 2012 beendet sein wird. Es dauert lange und viele Augen, um davon überzeugt zu sein, dass eine Hash-Funktion tatsächlich sicher ist, und keine dieser Funktionen dafür gibt es schon lange genug.
Eric Burnett

Ich stimme Ihren Ansichten zu, aber ich denke, die Community befindet sich in einer seltsamen Position. Alle verwendeten Hash-Funktionen sind gefährlich nahe daran, kaputt zu gehen (vielleicht, vielleicht nicht SHA2 256-512), und dennoch müssen wir bis 2012 warten, um einen Ersatz zu wählen. Wählen Sie Ihr Gift: schwach / gebrochen oder ungetestet (die meisten NIST-Kandidaten sind seit mehr als 6 Monaten nicht mehr öffentlich)? Schwierige Entscheidung.
Ethan Heilman

5
RIPEMD ist defekt, aber RIPEMD-128/160/256 sind unterschiedlich und nicht defekt.
Bwooce

Mir sind keine performanten Implementierungen von Skein for .NET bekannt. Ich bin auf SkeinFish und nskein gestoßen, und beide waren sehr langsam.
Cocowalla

1
Ich würde mit der Verwendung von SHA-3 warten, bis der eigentliche Standard verfügbar ist, zumindest wenn Sie tatsächlich einem Standard folgen möchten. Der Algorithmus selbst hat zu viele Optionen.
Paŭlo Ebermann

3

Zur Verteidigung von MD5 ist keine Möglichkeit bekannt, eine Datei mit einem beliebigen MD5-Hash zu erstellen. Der ursprüngliche Autor muss im Voraus planen, dass eine Arbeitskollision auftritt. Wenn der Empfänger dem Absender vertraut, ist MD5 in Ordnung. MD5 ist defekt, wenn der Unterzeichner böswillig ist, es ist jedoch nicht bekannt, dass er für Man-in-the-Middle-Angriffe anfällig ist.


1
Ich bin zwar kein Experte auf diesem Gebiet, aber ist es heutzutage nicht annähernd möglich, beliebige MD5-Hashes mit brutaler Gewalt zu berechnen?
Mafu

@mafu: Späte Antwort hier, aber es ist möglich, jeden Hash mit Brute Force zu berechnen. Es könnte sehr lange dauern.
Warty

@ItzWarty Ich bezog mich speziell auf die benötigte Zeit - da MD5 ziemlich kurz ist, dachte ich, es könnte möglich sein, einfach eine vernünftige Computerquelle darauf zu werfen (E3 oder ein billiges Computergitter, ein paar Maschinen mit ein paar Grafikkarten, so etwas) in diese Richtung) und in der Lage sein, einen willkürlichen MD5-Hash innerhalb von beispielsweise wenigen Tagen zu berechnen.
Mafu

@mafu Ein Pre-Image-Angriff kostet 2 ^ 127 Hash-Aufrufe für einen 128-Bit-Hash. Dies ist alles andere als machbar. 2 ^ 80 Aufrufe sind machbar aber schon sehr teuer.
CodesInChaos

2

Welches Sie wirklich verwenden, hängt davon ab, wofür Sie es verwenden. Wenn Sie nur sicherstellen möchten, dass Dateien während der Übertragung nicht beschädigt werden und sich nicht um die Sicherheit sorgen, sollten Sie schnell und klein vorgehen. Wenn Sie digitale Signaturen für Rettungspakete im Wert von mehreren Milliarden US-Dollar benötigen und sicherstellen müssen, dass diese nicht gefälscht sind, sollten Sie sich schwer tun, sie zu fälschen und zu verlangsamen.


1
Viele Male, wenn ich über Problemlösungen diskutiere, erwähne ich, dass ich MD5 für eine schnelle Identität verwende (Hashing eines Strings), sagen sie "aber md5 ist kaputt ... benutze es nicht, benutze sha1" ... ich habe mich nicht wirklich angemeldet, fragte mich Wenn etwas mit einigen der schwächeren Hashs so grundlegend kaputt ist, dass sie vermieden werden sollten ... z. B. reale Arbeitsfälle, in denen normale Daten Kollisionen verursachen
Sam Saffron

Da MD5 fünfzehn Jahre lang für Millionen von Menschen gut funktioniert hat, vermute ich, dass es für Sie in Ordnung ist, wenn die Hash-Sicherheit nicht entscheidend ist.
mqp

2
@sambo MD5 funktioniert in fast allen Fällen einwandfrei, außer wenn die tatsächliche Sicherheit / Integrität Ihres Systems von der Verhinderung von Kollisionen abhängt .
Rex M

2

Ich möchte einschalten (bevor md5 auseinander gerissen wird), dass ich md5 trotz seiner überwältigenden Zerbrochenheit für viel Krypto immer noch ausgiebig benutze.

Solange Sie sich nicht vor Kollisionen schützen möchten (Sie können md5 auch in einem hmac sicher verwenden) und die Geschwindigkeit möchten (manchmal möchten Sie einen langsameren Hash), können Sie md5 dennoch sicher verwenden.


@Mike Ich bin mit dir dabei, das war eine Art, wonach ich mit dieser Frage gesucht habe, ist etwas über die schwächeren Hash-Funktionen, die so grundlegend kaputt sind, dass sie niemals verwendet werden sollten.
Sam Saffron

Darüber hinaus ist MD5 absolut in Ordnung, wenn die Daten oder die erforderliche Sicherheit der Daten eine kürzere Lebensdauer als die Rissperiode (einige Minuten heutzutage iirc) haben. Situativ nützlich, aber immer noch nützlich ist der Punkt.
Annakata

@annakata - Beachten Sie, dass Sie auch vermeiden müssen, Schlüssel für mehrere Nachrichten wiederzuverwenden, damit sie unter diesen Umständen verwendet werden können.
Steve Westbrook

2

Es wäre eine gute Idee, sich den BLAKE2- Algorithmus anzuschauen.

Wie beschrieben, ist es schneller als MD5 und mindestens so sicher wie SHA-3. Es wird auch von mehreren Softwareanwendungen implementiert , einschließlich WinRar.


Es könnte schneller sein, außer dass viele Implementierungen Hardware-Unterstützung haben, was SHA-256 ziemlich schnell macht.
Zaph

Genau. Ab 2019 ist Blake2b der beste bisher veröffentlichte Allzweck-Hash. Deutlich schneller als alle anderen Alternativen und nicht weniger sicher (zumindest in keiner sinnvollen Weise) und kann in nur 336 Byte RAM (168 für blake2s) ausgeführt werden, oh, und es ist für Little-Endian-CPUs optimiert der dominierende Endian auf heutigen Systemen.
Hanshenrik

0

Ich bin kein Experte in solchen Dingen, aber ich halte mit der Sicherheitsgemeinschaft Schritt und viele Leute dort halten den md5-Hash für kaputt. Ich würde sagen, dass die Verwendung von der Vertraulichkeit der Daten und der spezifischen Anwendung abhängt. Möglicherweise können Sie mit einem etwas weniger sicheren Hash davonkommen, solange der Schlüssel gut und stark ist.


1
Hash-Funktionen verwenden normalerweise keine Schlüssel
Ethan Heilman

0

Hier sind meine Vorschläge für Sie:

  1. Sie sollten MD5 wahrscheinlich vergessen, wenn Sie Angriffe erwarten. Es gibt viele Regenbogentabellen für sie online, und Unternehmen wie die RIAA sind dafür bekannt, Sequenzen mit äquivalenten Hashes erstellen zu können.
  2. Verwenden Sie ein Salz, wenn Sie können. Das Einfügen der Nachrichtenlänge in die Nachricht kann es sehr schwierig machen, eine nützliche Hash-Kollision durchzuführen.
  3. Als Faustregel gilt, dass mehr Bits weniger Kollisionen (nach dem Pigeonhole-Prinzip) und langsamer und möglicherweise sicherer bedeuten (es sei denn, Sie sind ein Mathe-Genie, das Schwachstellen finden kann).

Hier finden Sie ein Dokument mit einem detaillierten Algorithmus zum Erstellen von MD5-Kollisionen in 31 Sekunden mit einem Desktop-Intel P4-Computer.

http://eprint.iacr.org/2006/105


Dieser Kommentar ist sehr alt und scheint ziemlich begraben zu sein, aber dieses Stück - es ist bekannt, dass die RIAA Sequenzen mit äquivalenten Hashes produzieren kann - ist mir aufgefallen, und ich bin sehr gespannt, was der Kontext dafür war. Insbesondere das Bruteforcing von MD5 vor 8 Jahren war etwas weniger trivial als 2017, daher müssen sie einen ziemlich guten Grund gehabt haben.
i336_
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.