Das .NET Framework wird mit 6 verschiedenen Hashing-Algorithmen ausgeliefert:
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.
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();
}
In der Kryptographie bieten Hash-Funktionen drei separate Funktionen.
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.
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 .
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.
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.
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.
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. .
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 .
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.
Die Zeiten haben sich geändert, wir haben einen SHA3-Gewinner. Ich würde empfehlen, keccak (aka SHA ) Gewinner des SHA3-Wettbewerbs zu verwenden.
In der Reihenfolge vom schwächsten zum 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.
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.
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.
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.
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.
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.
Hier sind meine Vorschläge für Sie:
Hier finden Sie eine Beschreibung eines Algorithmus zum Erstellen von MD5-Kollisionen in 31 Sekunden mit einem Intel P4-Desktopcomputer.