web-dev-qa-db-de.com

Wann ist CRC geeigneter als MD5 / SHA1?

Wann ist es angebracht, CRC zur Fehlererkennung im Vergleich zu moderneren Hashing-Funktionen wie MD5 oder SHA1 zu verwenden? Ist der erstere einfacher auf eingebetteter Hardware zu implementieren?

117
Gili

CRC eignet sich gut zum Erkennen zufälliger Fehler in Daten, die beispielsweise durch Netzwerkstörungen, Leitungsrauschen, Verzerrungen usw. auftreten können.

CRC ist rechnerisch weitaus weniger komplex als MD5 oder SHA1. Die Verwendung einer Hash-Funktion wie MD5 ist für die zufällige Fehlererkennung wahrscheinlich zu viel. Die Verwendung von CRC für jede Art von Sicherheitsüberprüfung wäre jedoch viel weniger sicher als eine komplexere Hashing-Funktion wie MD5.

Und ja, CRC ist auf eingebetteter Hardware viel einfacher zu implementieren. Sie können sogar verschiedene Paketlösungen für diese auf IC erhalten.

103
defines

CRC wurde gegen unbeabsichtigte Änderungen der Daten entwickelt. Das heißt, es ist gut, um unbeabsichtigte Fehler zu erkennen, kann jedoch nicht verwendet werden, um sicherzustellen, dass Daten nicht böswillig behandelt wurden.

Siehe auch this .

29
Liran Orevi

Ich fand eine Studie, die zeigt wie unangemessen CRC-Hashes sind für Hash-Tabellen . Außerdem werden die tatsächlichen Eigenschaften des Algorithmus erläutert. Die Studie beinhaltet auch die Evaluierung anderer Hash-Algorithmen und ist eine gute Referenz, die Sie behalten sollten.

Die relevante Schlussfolgerung zu CRC für Hashes:

CRC32 war niemals für die Verwendung in Hash-Tabellen vorgesehen. Es gibt wirklich keinen guten Grund, es für diesen Zweck zu verwenden, und ich empfehle Ihnen, dies zu vermeiden. Wenn Sie sich für die Verwendung von CRC32 entscheiden, ist es wichtig, dass Sie die Hash-Bits von dem Ende verwenden, das dem entgegengesetzt ist, in das die Schlüsseloktette eingegeben werden. Welches Ende dies ist, hängt von der spezifischen CRC32-Implementierung ab. Behandeln Sie CRC32 nicht als "Black-Box" -Hash-Funktion und verwenden Sie es nicht als Allzweck-Hash. Stellen Sie sicher, dass Sie jede Anwendung auf ihre Eignung prüfen.

[~ # ~] Update [~ # ~]

Es scheint, dass die Website nicht verfügbar ist. Das Internetarchiv hat eine Kopie allerdings.

19
Andre Luus

Ich habe jede Zeile dieses PHP Code in einer 1.000.000 Schleife ausgeführt. Ergebnisse sind in Kommentaren (#).

hash('crc32', 'The quick brown fox jumped over the lazy dog.');#  750ms   8 chars
hash('crc32b','The quick brown fox jumped over the lazy dog.');#  700ms   8 chars
hash('md5',   'The quick brown fox jumped over the lazy dog.');#  770ms  32 chars
hash('sha1',  'The quick brown fox jumped over the lazy dog.');#  880ms  40 chars
hash('sha256','The quick brown fox jumped over the lazy dog.');# 1490ms  64 chars
hash('sha384','The quick brown fox jumped over the lazy dog.');# 1830ms  96 chars
hash('sha512','The quick brown fox jumped over the lazy dog.');# 1870ms 128 chars

Meine Schlussfolgerung:

  • Verwenden Sie "crc32b", wenn Sie http://en.wikipedia.org/wiki/Cyclic_redundancy_check benötigen und Ihnen die Sicherheit egal ist.
  • Verwenden Sie "sha256" (oder höher), wenn Sie eine zusätzliche Sicherheitsschicht benötigen.

  • Verwenden Sie nicht "md5" oder "sha1", da diese Folgendes haben:

    1. einige Sicherheitsprobleme, wenn Sie Wert auf Sicherheit legen
    2. längere Hash-Zeichenkette und langsamer als "crc32b", wenn Sie nur CRC benötigen
17
Martin

CRC-Informationen zu Implementierung, Geschwindigkeit und Zuverlässigkeit finden Sie unter Eine schmerzlose Anleitung zu CRC-Fehlererkennungsalgorithmen . Es hat alles auf CRCs.

Es sei denn, jemand wird versuchen, Ihre Daten in böswilliger Absicht zu ändern und die CRC-Änderung zu verbergen, ist ausreichend. Verwenden Sie einfach ein "Gutes" (Standard) Polinom.

10
Gerhard

Sie sagen nicht, was Sie zu schützen versuchen.

Ein CRC wird in eingebetteten Systemen häufig zur Überprüfung auf versehentliche Datenbeschädigung verwendet, anstatt böswillige Systemänderungen zu verhindern. Beispiele für Stellen, an denen eine CRC nützlich sein kann, sind das Validieren eines EPROM-Images während der Systeminitialisierung, um eine Beschädigung der Firmware zu vermeiden. Der System-Bootloader berechnet die CRC für den Anwendungscode und vergleicht sie mit dem gespeicherten Wert, bevor der Code ausgeführt wird. Dies schützt vor versehentlicher Programmbeschädigung oder fehlgeschlagenem Download.

Ein CRC kann auf ähnliche Weise auch zum Schutz von Konfigurationsdaten verwendet werden, die in FLASH oder EEPROM gespeichert sind. Wenn der CRC nicht korrekt ist, können die Daten als ungültig markiert und ein Standard- oder Sicherungsdatensatz verwendet werden. Die CRC kann aufgrund eines Gerätefehlers ungültig sein oder wenn der Benutzer während einer Aktualisierung des Konfigurationsdatenspeichers die Stromversorgung unterbrochen hat.

Es wurde angemerkt, dass ein Hash mit höherer Wahrscheinlichkeit eine Beschädigung erkennt als ein CRC mit mehreren Bitfehlern. Dies ist richtig, und die Entscheidung, ob ein 16- oder 32-Bit-CRC verwendet werden soll oder nicht, hängt von den Sicherheitsfolgen ab, die sich aus der Verwendung eines beschädigten Datenblocks ergeben Der Datenblock wurde fälschlicherweise für gültig erklärt.

Viele Geräte verfügen über einen eingebauten CRC-Generator für Standardalgorithmen. Die MSP430F5X-Serie aus Texas verfügt über eine Hardware-Implementierung des CRC-CCITT-Standards.

8
uɐɪ

CRC32 ist schneller und der Hash ist nur 32 Bit lang.

Verwenden Sie es, wenn Sie nur eine schnelle und leichte Prüfsumme wünschen. CRC wird im Ethernet verwendet.

Wenn Sie mehr Zuverlässigkeit benötigen, ist die Verwendung einer modernen Hash-Funktion vorzuziehen.

6
François

Alles hängt von Ihren Anforderungen und Erwartungen ab.

Hier einige kurze Unterschiede zwischen diesen Hash-Funktion Algorithmen:

CRC (CRC-8/16/32/64)

  • ist kein kryptografischer Hashing-Algorithmus
  • kann entweder 9, 17, 33 oder 65 Bits erzeugen
  • nicht für kryptografische Zwecke bestimmt, da keine kryptografischen Garantien gegeben sind,
  • für digitale Signaturen ungeeignet, da leicht umkehrbar2006,
  • sollte nicht für Verschlüsselungszwecke verwendet werden,
  • verschiedene Zeichenfolgen können die Kollision erzeugen,
  • 1961 erfunden und in Ethernet und vielen anderen Standards verwendet,

MD5

  • ist ein kryptografischer Hash-Algorithmus,
  • erzeugen eines 128-Bit-Hashwerts (16 Byte) (32-stellige Hexadezimalzahlen)
  • es handelt sich um einen kryptografischen Hash, der jedoch aus Sicherheitsgründen als veraltet gilt.
  • Es sind Zeichenfolgen bekannt, die denselben MD5-Hashwert haben
  • kann für Verschlüsselungszwecke verwendet werden,

SHA-1

  • ist ein kryptografischer Hash-Algorithmus,
  • erzeugt einen 160-Bit-Hashwert (20 Byte), der als Message Digest bezeichnet wird
  • es ist ein kryptographischer Hash und seit 2005 gilt er nicht mehr als sicher,
  • kann für Verschlüsselungszwecke verwendet werden,
  • ein Beispiel für eine sha1-Kollision wurde gefunden
  • zuerst 1993 veröffentlicht (als SHA-0), dann 1995 als SHA-1,
  • serie: SHA-0, SHA-1, SHA-2, SHA-3,

    Zusammenfassend gilt die Verwendung von SHA-1 nicht mehr als sicher gegenüber finanzstarken Gegnern, da Kryptoanalytiker im Jahr 2005 Angriffe auf SHA-1 fanden, die darauf hindeuten, dass die Sicherheit für die fortgesetzte Verwendung möglicherweise nicht ausreichend istschneier. Das US-NIST rät den Bundesbehörden, SHA1-1 nicht mehr für Anwendungen zu verwenden, die Kollisionssicherheit erfordern, und SHA-2 nach 2010 zu verwenden NIST .

Wenn Sie nach einer einfachen und schnellen Lösung suchen, um die Integrität einer Datei (gegen Beschädigung) zu überprüfen, oder um die Leistung zu verbessern, sollten Sie CRC-32 für Hashing in Betracht ziehen Wenn Sie jedoch eine professionelle Anwendung entwickeln (die sicher und konsistent sein sollte), verwenden Sie SHA-2 und höher (z. B. SHA-3), um Kollisionswahrscheinlichkeiten zu vermeiden.

Performance

Einige einfache Benchmark-Tests in PHP:

# Testing static text.

$ time php -r 'for ($i=0;$i<1000000;$i++) crc32("foo");'
real    0m0.845s
user    0m0.830s
sys     0m0.008s

$ time php -r 'for ($i=0;$i<1000000;$i++) md5("foo");'
real    0m1.103s
user    0m1.089s
sys     0m0.009s

$ time php -r 'for ($i=0;$i<1000000;$i++) sha1("foo");'
real    0m1.132s
user    0m1.116s
sys   0m0.010s

# Testing random number. 

$ time php -r 'for ($i=0;$i<1000000;$i++) crc32(Rand(0,$i));'
real    0m1.754s
user    0m1.735s
sys     0m0.012s\

$ time php -r 'for ($i=0;$i<1000000;$i++) md5(Rand(0,$i));'
real    0m2.065s
user    0m2.042s
sys     0m0.015s

$ time php -r 'for ($i=0;$i<1000000;$i++) sha1(Rand(0,$i));'
real    0m2.050s
user    0m2.021s
sys     0m0.015s

Verbunden:

6
kenorb

Verwenden Sie CRC nur, wenn die Rechenressourcen sehr knapp sind (z. B. einige Embed-Umgebungen) oder wenn Sie viele Ausgabewerte speichern/transportieren müssen und Speicherplatz/Bandbreite knapp sind (da CRCs in der Regel 32-Bit sind und eine MD5-Ausgabe 128-Bit ist, SHA1 160) Bit und andere SHA Varianten bis zu 512 Bit).

Verwenden Sie CRC niemals für Sicherheitsüberprüfungen, da ein CRC sehr einfach zu "fälschen" ist.

Selbst bei der Erkennung versehentlicher Fehler (anstelle der Erkennung böswilliger Änderungen) sind Hashes besser als ein einfacher CRC. Teilweise aufgrund der einfachen Art der Berechnung einer CRC (und teilweise, weil CRC-Werte normalerweise kürzer sind als übliche Hash-Ausgaben und daher einen viel kleineren Bereich möglicher Werte aufweisen), ist es viel wahrscheinlicher, dass in einer Situation zwei oder mehr Fehler auftreten Wenn ein Fehler einen anderen maskiert, erhalten Sie trotz zweier Fehler denselben CRC.

Kurz gesagt: Vermeiden Sie einfache CRCs, es sei denn, Sie haben Grund nicht, einen anständigen Hash-Algorithmus zu verwenden.

5
David Spillett

Ich bin kürzlich auf eine Verwendung von CRC gestoßen, die klug war. Der Autor des Identifizierungs- und Entfernungs-Tools jdupe für Dateiduplikationen (derselbe Autor des beliebten Exif-Tools jhead) verwendet es beim ersten Durchlauf der Dateien. Auf den ersten 32 KB jeder Datei wird ein CRC berechnet, um Dateien zu kennzeichnen, die identisch zu sein scheinen. Außerdem müssen die Dateien dieselbe Größe haben. Diese Dateien werden zu einer Liste von Dateien hinzugefügt, für die ein vollständiger Binärvergleich durchgeführt werden soll. Es beschleunigt das Überprüfen großer Mediendateien.

5
John Wright

Beginnen wir mit den Grundlagen.

In der Kryptographie konvertiert ein Hashing-Algorithmus viele Bits durch eine Digest-Operation in weniger Bits. Hashes werden verwendet, um die Integrität von Nachrichten und Dateien zu bestätigen.

Alle Hashing-Algorithmen erzeugen Kollisionen. Eine Kollision liegt vor, wenn mehrere Mehrbitkombinationen dieselbe Ausgabe mit weniger Bits erzeugen. Die kryptografische Stärke eines Hashing-Algorithmus wird dadurch definiert, dass eine Person nicht bestimmen kann, wie die Ausgabe für eine bestimmte Eingabe aussehen soll, da sie, wenn sie könnte, eine Datei mit einem Hash erstellen könnte, der einer legitimen Datei entspricht, und die angenommene Integrität gefährden könnte vom System. Der Unterschied zwischen CRC32 und MD5 besteht darin, dass MD5 einen größeren Hash generiert, der schwerer vorherzusagen ist.

Wenn Sie die Nachrichtenintegrität implementieren möchten, dh die Nachricht wurde während der Übertragung nicht manipuliert, ist die Unfähigkeit, Kollisionen vorherzusagen, eine wichtige Eigenschaft. Ein 32-Bit-Hash kann 4 Milliarden verschiedene Nachrichten oder Dateien mit 4 Milliarden verschiedenen eindeutigen Hashes beschreiben. Wenn Sie 4 Milliarden und 1 Dateien haben, haben Sie garantiert 1 Kollision. 1 TB Bitspace hat die Möglichkeit für Milliarden von Kollisionen. Wenn ich ein Angreifer bin und vorhersagen kann, was dieser 32 - Bit - Hash sein wird, kann ich eine infizierte Datei erstellen, die mit dem kollidiert Zieldatei, die den gleichen Hash hat.

Wenn ich eine 10-Mbit/s-Übertragung durchführe, ist außerdem die Wahrscheinlichkeit sehr gering, dass ein Paket genau richtig beschädigt wird, um crc32 zu umgehen und auf dem Weg zum Ziel fortzufahren und auszuführen. Sagen wir mal bei 10mbps bekomme ich 10 Fehler\Sekunde. Wenn ich das auf 1 Gbit/s erhöhe, erhalte ich 1.000 Fehler pro Sekunde. Wenn ich bis zu 1 Exabit pro Sekunde ramme, habe ich eine Fehlerrate von 1.000.000.000 Fehler pro Sekunde. Nehmen wir an, wir haben eine Kollisionsrate von 1\1,000,000 Übertragungsfehlern, was bedeutet, dass 1 in einer Million Übertragungsfehlern dazu führt, dass die beschädigten Daten unentdeckt durchkommen. Bei 10 MBit/s werden Fehlerdaten alle 100.000 Sekunden oder ungefähr einmal am Tag gesendet. Bei 1 Gbit/s würde es einmal alle 5 Minuten passieren. Bei 1 Exabit pro Sekunde sprechen wir mehrmals pro Sekunde.

Wenn Sie Wireshark öffnen, sehen Sie, dass Ihr typischer Ethernet-Header einen CRC32 hat, Ihr IP-Header einen CRC32 und Ihr TCP Header einen CRC32, und das zusätzlich zu dem, was höher ist Layer-Protokolle sind möglicherweise ausreichend, z. B. verwendet IPSEC MD5 oder SHA zur Integritätsprüfung zusätzlich zu den oben genannten. In der typischen Netzwerkkommunikation gibt es mehrere Layer mit Fehlerprüfungen, die ab und zu immer wieder auftreten Geschwindigkeiten unter 10 Mbit/s.

Cyclic Redundancy Check (CRC) hat mehrere gängige und einige seltene Versionen, wurde jedoch im Allgemeinen entwickelt, um nur zu erkennen, wann eine Nachricht oder Datei während der Übertragung beschädigt wurde (Spiegeln mehrerer Bits). CRC32 an sich ist aufgrund der Kollisionsrate nach heutigen Standards kein sehr gutes Fehlerprüfungsprotokoll in großen, skalaren Unternehmensumgebungen. Die Festplatte eines durchschnittlichen Benutzers kann mehr als 100.000 Dateien enthalten, und die Dateifreigaben eines Unternehmens können mehrere zehn Millionen Dateien enthalten. Das Verhältnis von Hash-Speicherplatz zu Anzahl der Dateien ist einfach zu gering. CRC32 ist recheneffizient zu implementieren, MD5 hingegen nicht.

MD5 wurde entwickelt, um die absichtliche Verwendung von Kollisionen zu unterbinden und eine schädliche Datei harmlos erscheinen zu lassen. Es wird als unsicher angesehen, da der Hashspace ausreichend zugeordnet wurde, um einige Angriffe zu ermöglichen, und einige Kollisionen vorhersehbar sind. SHA1 und SHA2 sind die neuen Kids im Block.

Für die Dateiverifizierung wird Md5 bereits von vielen Anbietern verwendet, da Sie damit schnell Multigigabyte- oder Multiterrabyte-Dateien erstellen und diese zusätzlich zur allgemeinen Verwendung und Unterstützung von CRC32-Dateien für das Betriebssystem stapeln können. Seien Sie nicht überrascht, wenn Dateisysteme in den nächsten zehn Jahren MD5 für die Fehlerprüfung verwenden.

4
bobinator

CRC32 ist viel schneller und unterstützt manchmal Hardware (d. H. Auf Nehalem-Prozessoren). Wirklich, das einzige Mal, dass Sie es verwenden würden, ist, wenn Sie mit Hardware kommunizieren oder wenn Sie wirklich wenig Leistung haben

4
Paul Betts

CRC-Code ist einfacher und schneller.

Wofür brauchst du welche?

1
Macarse