it-swarm.com.de

Welche kryptografische Hash-Funktion soll ich wählen?

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

  • MD5: 16 Byte (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 Byte (3820 ms)
  • RIPEMD: 20 Bytes (7066 ms)

Jede dieser Funktionen ist unterschiedlich ausgeführt. MD5 ist am schnellsten und RIPEMD am langsamsten.

MD5 hat den Vorteil, dass es in den eingebauten Guid-Typ passt; nd es ist die Basis der Typ 3 UUID . SHA-1-Hash ist die Basis der UUID des Typs 5. Dadurch sind sie für die Identifizierung sehr einfach 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 mich sehr freue, sind:

  • Ist MD5 nicht vertrauenswürdig? Unter normalen Umständen, wenn Sie den MD5-Algorithmus ohne böswillige Absicht und ohne böswillige Absicht eines Dritten verwenden, erwarten Sie ALLE Kollisionen (dh zwei willkürliche 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 groß 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();
    }
133
Sam Saffron

In der Kryptographie bieten Hash-Funktionen drei separate Funktionen.

  1. Kollisionsresistenz: Wie schwer ist es für jemanden, zwei Nachrichten ( alle zwei Nachrichten) zu finden, die das gleiche Hash haben.
  2. Preimage Resistance: Wie schwer ist es angesichts eines Hashs, eine andere Nachricht zu finden, die das gleiche Hash enthält? Auch bekannt als Einweg-Hash-Funktion .
  3. Zweiter Preimage-Widerstand: Finde bei einer gegebenen Nachricht eine andere Nachricht, die die gleiche Bedeutung hat.

Diese Eigenschaften sind verwandt, aber unabhängig. Zum Beispiel impliziert die Kollisionsbeständigkeit eine zweite Bildbeständigkeit, aber nicht umgekehrt. Für eine bestimmte 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 in der Regel nur eine Vorabbeständigkeit, während für Message Digests alle drei erforderlich sind.

Es hat sich gezeigt, dass MD5 nicht kollisionsfest ist, was jedoch seinen Einsatz in Anwendungen, die keine Kollisionsfestigkeit erfordern, nicht ausschließt. Tatsächlich wird MD5 immer noch häufig 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 erlaubt, Kollisionen in theoretisch weit weniger als den 2 ^ 80 Schritten zu finden, die eine sichere Hash-Funktion seiner Länge erfordern würde. Der Angriff wird ständig überarbeitet und kann derzeit in ~ 2 ^ 63 Schritten ausgeführt werden - nur knapp innerhalb des aktuellen Bereichs der Berechenbarkeit. Aus diesem Grund verzichtet NIST auf die Verwendung von SHA1 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 Kryptographieforschern nicht so genau untersucht wurde allein 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 auf die jeweiligen Fehler und wählen Sie am besten die richtige Hash-Funktion für Ihr Szenario.

135
Eric Burnett

Alle Hash-Funktionen sind "kaputt"

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

MD5/SHA1/Sha2xx haben keine zufälligen Kollisionen

Alle Hash-Funktionen haben Kollisionen, das ist eine Tatsache des Lebens. Diese Kollisionen zufällig zu begegnen ist das Äquivalent zum 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, fragst du dich? 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-Attacken auf MD5 bekannt.

Also, was ist an MD5 so kaputt? Es ist für einen Dritten möglich, zwei Nachrichten zu generieren, von denen eine EVIL und eine GUTE ist, die beide den gleichen Wert haben. ( Kollisionsangriff )

Die aktuelle RSA-Empfehlung lautet jedoch, MD5 nicht zu verwenden, wenn Sie Pre-Image-Resistenz benötigen. Menschen neigen dazu, bei Sicherheitsalgorithmen auf der Hut zu sein.

Welche Hash-Funktion sollte ich in .NET verwenden?

  • Verwenden Sie MD5, wenn Sie die Geschwindigkeit/Größe benötigen und sich nicht um Geburtstagsangriffe oder Pre-Image-Angriffe kümmern.

Wiederholen Sie dies nach mir, es gibt keine Chance, MD5-Kollisionen , böswillige Kollisionen können sorgfältig entwickelt werden. Obwohl bisher keine Pre-Image-Angriffe auf MD5 bekannt sind, sollten Sie MD5 nach Meinung der Sicherheitsexperten nicht dort einsetzen, wo Sie sich gegen Pre-Image-Angriffe verteidigen müssen. GLEICHES gilt für SHA1 .

Denken Sie daran, dass nicht alle Algorithmen vor Imaging- oder Kollisionsangriffen geschützt werden müssen. Machen Sie den trivialen Fall einer First-Pass-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. Im Übrigen hat noch nie jemand eine SHA256- oder 384-Kollision gefunden. .

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

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

SHA1-Kollisionsangriffe sind auf 2 ^ 52 begrenzt, es wird nicht zu lange dauern, bis SHA1-Kollisionen in der Natur sind.

Aktuelle Informationen zu den verschiedenen Hash-Funktionen finden Sie unter die Hash-Funktion Zoo .

Aber warte, es gibt noch mehr

Eine schnelle Hash-Funktion zu haben, kann ein Fluch sein. Zum Beispiel: Eine sehr häufige Verwendung für Hash-Funktionen ist das Speichern von Passwörtern. Im Wesentlichen berechnen Sie den Hash eines Kennworts 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, Passwörter mit Brute-Force sehr 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 Algorithmus bcrypt verwendet werden. Er ist langsam, sodass der Angreifer stark verlangsamt wird, wenn er ein System mit bcrypt angreift. Vor kurzem hat scrypt einige Schlagzeilen gemacht und wird von einigen als effektiver als bcrypt angesehen, aber ich kenne keine .Net-Implementierung.

108
Sam Saffron

Aktualisieren:

Die Zeiten haben sich geändert, wir haben einen SHA3-Gewinner. Ich würde empfehlen, keccak (aka SHA ) Gewinner des SHA3-Wettbewerbs zu verwenden.

Ursprüngliche Antwort:

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

  1. RIPEMD BROKEN, sollte nie verwendet werden wie in diesem pdf zu sehen ist
  2. MD-5 BROKEN, sollte niemals verwendet werden, kann mit einem Laptop in 2 Minuten unterbrochen werden
  3. SHA-1 BROKEN, sollte nie benutzt werden ist prinzipiell defekt, Angriffe werden von Woche zu Woche besser
  4. SHA-2 WEAK, wird wahrscheinlich in den nächsten Jahren kaputt sein. Es wurden einige Schwachstellen gefunden. Beachten Sie, dass es im Allgemeinen umso schwieriger ist, die Hash-Funktion zu unterbrechen, je größer der Schlüssel 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. Knäuel KEINE BEKANNTEN SCHWÄCHEN, ist ein Kandidat für SHA- . Es ist ziemlich neu und somit ungetestet. Es wurde in einer Reihe von Sprachen implementiert.
  6. MD6 KEINE BEKANNTEN SCHWÄCHEN, ist ein weiterer Kandidat für SHA-3. Wahrscheinlich stärker als Skien, aber langsamer auf Einkernmaschinen. 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.

35
Ethan Heilman

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 eine funktionierende Kollision einplanen. Wenn also 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.

3
rlbond

Welches Sie verwenden, hängt wirklich 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 keine Sorgen um die Sicherheit machen, sollten Sie schnell und klein vorgehen. Wenn Sie digitale Signaturen für Rettungsvereinbarungen im Wert von mehreren Milliarden US-Dollar benötigen und sicherstellen müssen, dass diese nicht gefälscht sind, sollten Sie sich anstrengen, um sie zu fälschen und zu verlangsamen.

2
tvanfosson

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

Solange Sie sich nicht um den Schutz vor Kollisionen kümmern (Sie können md5 auch in einem hmac sicher verwenden) und die Geschwindigkeit (manchmal möchten Sie einen langsameren Hash) möchten, können Sie md5 auch weiterhin sicher verwenden.

2
Mike Boers

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

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

1
Florin Mircea

Ich bin kein Experte in dieser Art von Dingen, aber ich halte mit der Sicherheitsgemeinschaft Schritt und viele Leute halten den md5-Hash für kaputt. Ich würde sagen, dass die Auswahl davon abhängt, wie sensibel die Daten sind und welche Anwendung sie verwendet. Sie könnten mit einem etwas weniger sicheren Hash davonkommen, solange der Schlüssel gut und stark ist.

0
blueintegral

Hier sind meine Vorschläge für Sie:

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

Hier finden Sie eine Beschreibung eines Algorithmus zum Erstellen von MD5-Kollisionen in 31 Sekunden mit einem Intel P4-Desktopcomputer.

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

0
Unknown