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();
}
quelle
Antworten:
In der Kryptographie bieten Hash-Funktionen drei separate Funktionen.
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 .
quelle
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?
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.
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. .
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.
quelle
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:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
Hier sind meine Vorschläge für Sie:
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
quelle