Quando CRC è più appropriato da utilizzare rispetto a MD5 / SHA1?


130

Quando è appropriato utilizzare CRC per il rilevamento degli errori rispetto a funzioni di hashing più moderne come MD5 o SHA1? Il primo è più facile da implementare su hardware incorporato?

Risposte:


114

CRC funziona perfettamente per rilevare errori casuali nei dati che potrebbero verificarsi, ad esempio, da interferenze di rete, rumore di linea, distorsione, ecc.

CRC è computazionalmente molto meno complesso di MD5 o SHA1. L'uso di una funzione hash come MD5 è probabilmente eccessivo per il rilevamento di errori casuali. Tuttavia, l'utilizzo di CRC per qualsiasi tipo di controllo di sicurezza sarebbe molto meno sicuro di una funzione di hashing più complessa come MD5.

E sì, CRC è molto più facile da implementare su hardware incorporato, puoi persino ottenere diverse soluzioni pacchettizzate per questo su IC.


1
@gili: puoi sempre semplicemente xor le parole insieme per ottenere una singola parola risultante.
Blindy,

2
@Dustin: hai completamente ragione nella tua risposta, ma forse potresti considerare di cambiare "CRC è molto più efficiente dal punto di vista computazionale" in "CRC è molto più semplice dal punto di vista computazionale"? Gli algoritmi MD5 / SHA-1 sono IMO complessi, ma non realmente 'inefficienti'.
Coxy,

1
@coxymla hai ragione, la parola che avrei dovuto usare è "complessa" non "inefficiente". Grazie!
definisce il

27
Per ridurre un hash lungo a 32 bit, basta prendere i primi 32 bit.
orip,

1
Se la sicurezza è il tuo obiettivo, allora non dovresti mai usarlo MD5, SHA-1dovrebbe anche essere evitato, SHA-2si consiglia una variante di .
Peter

33

CRC è progettato contro modifiche involontarie nei dati. Cioè, è buono per rilevare errori involontari, ma sarà inutile come modo per assicurarsi che i dati non siano stati gestiti in modo dannoso.

Vedi anche questo .


Parte più importante del link in questa risposta: "(...) anche un CRC a 2048 bit sarebbe crittograficamente molto meno sicuro di un MD5 a 128 bit"
Marc.2377,

3
Mentre la risposta è ancora corretta, MD5 e SHA1 sono allo stesso livello di sicurezza al giorno d'oggi. In altre parole, buono solo per rilevare errori involontari.
Piskvor lasciò l'edificio il

21

Ho trovato uno studio che mostra come gli hash CRC inappropriati siano per le tabelle hash . Spiega anche le caratteristiche effettive dell'algoritmo. Lo studio include anche la valutazione di altri algoritmi di hash ed è un buon riferimento da mantenere.

Le conclusioni pertinenti su CRC per gli hash:

CRC32 non è mai stato progettato per l'uso della tabella hash. Non c'è davvero alcun buon motivo per usarlo a questo scopo, e ti consiglio di evitare di farlo. Se decidi di utilizzare CRC32, è fondamentale utilizzare i bit di hash dall'estremità opposta a quella in cui vengono inseriti gli ottetti chiave. Quale estremità dipende dall'implementazione specifica di CRC32. Non considerare CRC32 come una funzione hash "scatola nera" e non usarlo come hash generico. Assicurati di testare ogni sua applicazione per l'idoneità.

AGGIORNARE

Sembra che il sito non sia attivo. L' archivio Internet ne ha una copia .


Il collegamento è interrotto. Forse puoi scrivere tu stesso la spiegazione? Altrimenti la risposta è inutile.
ceving il

Ok, includerò la conclusione nella mia risposta.
Andre Luus,

Strano, secondo il benchmark qui , CRC in realtà fa abbastanza bene in termini di velocità e numero di collisioni.
ostrokach,

Davvero molto interessante. Ho dovuto esaminare di nuovo lo studio a cui mi sono collegato, ma se dovessi indovinarlo deve essere a causa delle diverse implementazioni dei test. Se dovessi prendere una decisione, sceglierei il consiglio dello studio, sembra essere scientificamente più valido.
Andre Luus,

Nella mia esperienza con hashing milioni di URL, CRC64 si è scontrato 8 volte e MD5 si è scontrato 5. Ovviamente MD5 era migliore, ma CRC64 era un hash fantastico, molto più veloce e più semplice.
J. Dimeo,

18

Ho eseguito ogni riga di questo codice PHP in 1.000.000 di loop. I risultati sono nei commenti (#).

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

La mia conclusione:

  • Usa "crc32b" quando hai bisogno di http://en.wikipedia.org/wiki/Cyclic_redundancy_check e non ti interessa la sicurezza.
  • Usa "sha256" (o superiore) quando hai bisogno di un ulteriore livello di sicurezza.

  • Non usare "md5" o "sha1" perché hanno:

    1. alcuni problemi di sicurezza quando ti preoccupi della sicurezza
    2. stringa di hash più lunga e più lenta di "crc32b" quando tutto ciò di cui hai bisogno è CRC

intendi bit, non caratteri
esskar,

Non proprio. echo hash ('crc32', 'La veloce volpe marrone saltò sul cane pigro.'); fa eco a "413a86af", ovvero una stringa lunga di 8 caratteri. A proposito, è un numero a 32 bit memorizzato in formato HEX. Ad esempio, "sha256" ha un hash a 256 bit, nuovamente memorizzato come esadecimale, che fornisce una stringa lunga di 64 caratteri.
Martin,

45
Questi risultati sono molto ingannevoli. Quando questi algoritmi di hashing vengono applicati a un set di dati di grandi dimensioni ( War and Peace anziché "The quick brown fox jumped over the lazy dog."), vedrai quanto CRC è più veloce di MD5.
ubiquibacon,

1
Esiste un caso intermedio (controllo duplicato nelle librerie) in cui MD5 / Sha1 sono la soluzione corretta: non hanno bisogno di gestire il caso in cui c'è un avversario che elabora accuratamente la collisione hash evanescente, ma devono gestire collisioni accidentali. Quindi: Rilevamento di errori di bit e corruzione: CRC32 Rilevamento di collisioni nelle librerie: MD5 / SHA1 Applicazioni contraddittorie: Sha256 e successive. Naturalmente, se hai una libreria con miliardi di voci, probabilmente dovrai aumentare anche i tuoi bit di hash.
Dewi Morgan,

PHP? su una piattaforma ARM, codice incorporato, 16MHz un CRC32 di 46 byte, forse 12 microsecondi. Che ha assistenza hardware. Anche l'AES assistito dall'hardware sarebbe più lento di alcune centinaia di volte. La tabella di ricerca non assistita CRC dovrebbe comunque arrivare a circa 50 microsecondi.
ilgitano,


9

Tutto dipende dalle tue esigenze e aspettative.

Ecco alcune brevi differenze tra questi algoritmi della funzione hash :

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

  • non è un algoritmo di hash crittografico (utilizza una funzione lineare basata su controlli di ridondanza ciclici)
  • può produrre 9, 17, 33 o 65 bit
  • non destinato a essere utilizzato a scopi crittografici poiché non offre garanzie crittografiche,
  • inadatto all'uso nelle firme digitali, perché è facilmente reversibile nel 2006 ,
  • non dovrebbe essere usato per scopi di crittografia,
  • stringhe diverse possono generare la collisione,
  • inventato nel 1961 e utilizzato in Ethernet e molti altri standard,

MD5

  • è un algoritmo hash crittografico,
  • producendo un valore hash a 128 bit (16 byte) (numeri esadecimali a 32 cifre)
  • è un hash crittografico, ma è considerato deprecato se ti preoccupi della sicurezza,
  • ci sono stringhe note che hanno lo stesso valore hash MD5
  • può essere utilizzato per scopi di crittografia,

SHA-1

  • è un algoritmo hash crittografico,

  • produce un valore hash a 160 bit (20 byte) noto come digest del messaggio

  • è un hash crittografico e dal 2005 non è più considerato sicuro,

  • può essere utilizzato per scopi di crittografia,

  • è stato trovato un esempio di collisione sha1

  • pubblicato per la prima volta nel 1993 (come SHA-0), poi nel 1995 come SHA-1,

  • serie: SHA-0, SHA-1, SHA-2, SHA-3,

    In sintesi, l'uso di SHA-1 non è più considerato sicuro contro avversari ben finanziati, perché nel 2005 i crittografi hanno scoperto attacchi su SHA-1 che suggeriscono che potrebbe non essere abbastanza sicuro per l'uso in corso schneier . Il NIST degli Stati Uniti consiglia alle agenzie federali di smettere di usare SHA1-1 per applicazioni che richiedono resistenza alle collisioni e che devono utilizzare SHA-2 dopo il NIST 2010 .

Pertanto, se stai cercando una soluzione semplice e veloce per controllare l'integrità di un file (contro la corruzione) o per alcuni semplici scopi di memorizzazione nella cache in termini di prestazioni, puoi considerare CRC-32, per l'hash che potresti prendere in considerazione di utilizzare MD5, tuttavia, se stai sviluppando un'applicazione professionale (che dovrebbe essere sicura e coerente), per evitare qualsiasi probabilità di collisione - usa SHA-2 e versioni successive (come SHA-3).

Prestazione

Alcuni semplici test benchmark 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

Relazionato:


8

Non dici cosa stai cercando di proteggere.

Un CRC viene spesso utilizzato nei sistemi incorporati come controllo contro il danneggiamento accidentale dei dati anziché impedire la modifica di sistemi dannosi. Esempi di luoghi in cui un CRC può essere utile è la convalida di un'immagine EPROM durante l'inizializzazione del sistema per evitare la corruzione del firmware. Il bootloader di sistema calcolerà il CRC per il codice dell'applicazione e lo confronterà con il valore memorizzato prima di consentire l'esecuzione del codice. Questo protegge dalla possibilità di corruzione accidentale del programma o download non riuscito.

Un CRC può anche essere usato in modo simile per proteggere i dati di configurazione memorizzati in FLASH o EEPROM. Se il CRC non è corretto, è possibile contrassegnare i dati come non validi e utilizzare un set di dati predefinito o di backup. Il CRC potrebbe non essere valido a causa di un guasto del dispositivo o se l'utente ha rimosso l'alimentazione durante un aggiornamento dell'archivio dati di configurazione.

Ci sono stati commenti secondo cui un hash offre maggiori probabilità di rilevare la corruzione rispetto a un CRC con errori a più bit. Questo è vero e la decisione se utilizzare o meno un CRC a 16 o 32 bit dipenderà dalle conseguenze sulla sicurezza dell'utilizzo di un blocco dati corrotto e se è possibile giustificare la possibilità 1 in 2 ^ 16 o 2 ^ 32 di un blocco dati dichiarato erroneamente valido.

Molti dispositivi hanno un generatore CRC integrato per algoritmi standard. La serie MSP430F5X dal Texas ha un'implementazione hardware dello standard CRC-CCITT.


6

CRC32 è più veloce e l'hash è solo a 32 bit.

Usalo quando vuoi solo un checksum veloce e leggero. CRC è utilizzato in Ethernet.

Se hai bisogno di maggiore affidabilità, è preferibile utilizzare una moderna funzione di hashing.


5

Utilizzare CRC solo se le risorse di calcolo sono molto ridotte (ovvero alcuni ambienti di incorporamento) o è necessario archiviare / trasportare molti valori di output e lo spazio / larghezza di banda è ridotto (poiché i CRC sono in genere a 32 bit dove un'uscita MD5 è a 128 bit, SHA1 160 bit e altre varianti SHA fino a 512 bit).

Non utilizzare mai CRC per i controlli di sicurezza poiché un CRC è molto semplice da "falsificare".

Anche per il rilevamento accidentale di errori (piuttosto che per il rilevamento di modifiche dannose) gli hash sono migliori di un semplice CRC. In parte a causa del modo semplice in cui viene calcolato un CRC (e in parte perché i valori CRC sono generalmente più brevi delle comuni uscite hash, quindi hanno un intervallo molto più piccolo di valori possibili) è molto più probabile che, in una situazione in cui vi siano due o più errori , un errore ne maschererà un altro in modo da ottenere lo stesso CRC nonostante due errori.

In breve: a meno che tu non abbia motivo di non usare un algoritmo hash decente, evita i semplici CRC.


1
CRC rileverà tutte le modifiche accidentali dei dati se si utilizza un polinomio appropriato. 1/2 ^ 32 mancano le modifiche se si cambiano esattamente i bit multipli corretti.
Gerhard,

E con un polinomio adeguato, inoltre, rileva tutti gli errori di determinate classi comuni, ad esempio errori di scoppio.
erikkallen,

Concordo con la tua risposta, tranne per il fatto che la domanda riguarda i sistemi integrati. Le prestazioni di un algoritmo crittografico possono essere problematiche su sistemi embedded più piccoli.
Craig McQueen,

Non sarei assolutamente d'accordo. I polinomi di errore CRC sono scelti con cura in modo da poter dimostrare in modo dimostrabile 1,2,3,5 e scoppiare errori fino a qualcosa come 11 bit in alcuni casi. Un hash crittografico è puramente statistico, quindi è necessario utilizzare valori digest di grandi dimensioni. 8-32 bit non è realistico per un digest hash crittografico, oltre che inutilmente costoso in stile CPU e porte. Sicuramente non è una risposta da tenere in considerazione se lavori su sistemi embedded. L'unica volta in cui NON usare un CRC è se devi affrontare uno scenario avverso intelligente.
ilgitano,

5

Recentemente mi sono imbattuto in un uso di CRC che era intelligente. L'autore dello strumento di identificazione e rimozione della duplicazione dei file jdupe (lo stesso autore della popolare jhead dello strumento exif) lo usa durante il primo passaggio attraverso i file. Un CRC viene calcolato sui primi 32 KB di ciascun file per contrassegnare i file che sembrano essere gli stessi, inoltre i file devono avere le stesse dimensioni. Questi file vengono aggiunti a un elenco di file su cui eseguire un confronto binario completo. Accelera il controllo di file multimediali di grandi dimensioni.


Un problema con tale approccio è quando eseguito su un file che contiene un CRC32 incorporato al suo interno, il CRC risultante potrebbe essere indipendente dai dati nel file (poiché se i dati cambiano, il CRC32 verrà modificato in modo da annullare la differenza ). Mungere i dati in un modo semplice prima di calcolare il CRC32 eviterebbe questo problema.
supercat

1
@supercat - Non credo davvero che questo sia effettivamente un problema. Se un file contiene un'intestazione crc32 che è il crc32 del resto del file, quando il file viene aggiornato ogni bit nell'intestazione crc32 avrà circa il 50% di probabilità di essere diverso. Le modifiche nell'intestazione dovrebbero seguire una distribuzione abbastanza casuale. Non riesco a vedere come questo comporterà che CRC32 (intestazione + dati) sia sempre lo stesso o che non dipenda in alcun modo dalla porzione di dati del file.
teratorn,

@teratorn: ho visto un certo numero di file che hanno un CRC32 alla fine, calcolato in modo tale che il CRC32 dell'intero file, calcolato usando una particolare costante seed, sarà sempre un altro valore costante. Questo è abbastanza comune con cose come immagini di codice binario. Se il lettore DVD Acme 1000 utilizza immagini di codice di dimensioni fisse per gli aggiornamenti del firmware e si aspetta che ogni immagine di codice abbia un determinato CRC32, una routine che calcola i vari file del CRC32 non sarebbe in grado di distinguere diverse immagini di codice per Acme 1000.
supercat,

Il punto del CRC in quel caso è identificare rapidamente che i file sono diversi. Se il CRC ritorna allo stesso modo, ora devi fare un confronto binario costoso, quindi un CRC incorporato non rompe l'algoritmo. Potrebbe accadere che alcuni file finiscano per essere binari rispetto perché il primo passaggio CRC dice che POTREBBE essere lo stesso, ma è improbabile che siano molti di questi, e puoi evitarlo usando un polinomio personalizzato.
ilgitano,

4

CRC32 è molto più veloce e talvolta ha il supporto hardware (cioè sui processori Nehalem). Davvero, l'unica volta che lo useresti è se ti interfacciati con l'hardware o se sei molto limitato sulle prestazioni


4

Cominciamo con le basi.

In Cryptography, un algoritmo di hashing converte molti bit in meno bit attraverso un'operazione digest. Gli hash vengono utilizzati per confermare l'integrità di messaggi e file.

Tutti gli algoritmi di hashing generano collisioni. Una collisione si verifica quando diverse combinazioni di molti bit producono lo stesso output di meno bit. La forza crittografica di un algoritmo di hashing è definita dall'incapacità di un individuo di determinare quale sarà l'output per un determinato input perché se potessero potrebbero costruire un file con un hash che corrisponda a un file legittimo e compromettere l'integrità presunta del sistema. La differenza tra CRC32 e MD5 è che MD5 genera un hash più grande che è più difficile da prevedere.

Quando si desidera implementare l'integrità del messaggio, ovvero il messaggio non è stato manomesso durante il trasporto, l'incapacità di prevedere le collisioni è una proprietà importante. Un hash a 32 bit può descrivere 4 miliardi di messaggi o file diversi utilizzando 4 miliardi di hash univoci diversi. Se hai 4 miliardi e 1 file, hai la garanzia di avere 1 collisione. Bitspace da 1 TB ha la possibilità di miliardi di collisioni. Se sono un utente malintenzionato e posso prevedere quale sarà l'hash a 32 bit, posso costruire un file infetto che si scontra con il file di destinazione; che ha lo stesso hash.

Inoltre, se sto facendo una trasmissione a 10 Mbps, la possibilità che un pacchetto venga corrotto proprio per bypassare crc32 e continuare lungo la destinazione ed eseguire è molto bassa. Diciamo che a 10 Mbps ottengo 10 errori \ secondo . Se lo raggiungo fino a 1 gbps, ora ricevo 1.000 errori al secondo . Se sperpero fino a 1 esborso al secondo, allora ho un tasso di errore di 1.000.000.000 di errori al secondo . Supponiamo di avere un tasso di collisione di 1 \ 1.000.000errori di trasmissione, il significato 1 su un milione di errori di trasmissione fa sì che i dati corrotti non vengano rilevati. A 10 Mbps riceverei dati di errore inviati ogni 100.000 secondi o circa una volta al giorno. A 1 gbps accadrebbe una volta ogni 5 minuti. Ad 1 punto esadecimale al secondo, stiamo parlando più volte al secondo.

Se apri Wireshark, vedrai che la tua tipica intestazione Ethernet ha un CRC32, la tua intestazione IP ha un CRC32 e la tua intestazione TCP ha un CRC32, e questo è in aggiunta a ciò che possono fare i protocolli di livello superiore; ad es. IPSEC potrebbe utilizzare MD5 o SHA per il controllo dell'integrità oltre a quanto sopra. Esistono diversi livelli di controllo degli errori nelle comunicazioni di rete tipiche e ANCORA goof di tanto in tanto a velocità inferiori a 10 Mbps.

Cyclic Redundancy Check (CRC) ha diverse versioni comuni e diverse non comuni, ma generalmente è progettato per dire solo quando un messaggio o un file è stato danneggiato durante il trasporto (capovolgimento di più bit). CRC32 di per sé non è un ottimo protocollo di controllo degli errori secondo gli standard odierni in ambienti aziendali di grandi dimensioni e scalari a causa del tasso di collisione; il disco rigido degli utenti medi può avere fino a 100.000 file e le condivisioni di file in un'azienda possono avere decine di milioni. Il rapporto tra spazio hash e numero di file è troppo basso. CRC32 è computazionalmente economico da implementare mentre MD5 no.

MD5 è stato progettato per impedire l'uso intenzionale di collisioni per rendere un file dannoso benigno. È considerato insicuro perché l'hashspace è stato sufficientemente mappato per consentire il verificarsi di alcuni attacchi e alcune collisioni sono prevedibili. SHA1 e SHA2 sono i nuovi bambini del blocco.

Per la verifica dei file, Md5 sta iniziando a essere utilizzato da molti fornitori perché è possibile eseguire rapidamente file multigigabyte o file multiterrabyte e impilarli in cima all'utilizzo del sistema operativo generale e al supporto dei CRC32. Non stupitevi se entro il prossimo decennio i filesystem iniziano a usare MD5 per il controllo degli errori.


1

Il codice CRC è più semplice e veloce.

Di cosa hai bisogno?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.