Codice hash e checksum: qual è la differenza?


115

La mia comprensione è che un codice hash e un checksum sono cose simili: un valore numerico, calcolato per un blocco di dati, che è relativamente unico.

cioè la probabilità che due blocchi di dati producano lo stesso valore di hash / checksum numerico è sufficientemente bassa da poter essere ignorata ai fini dell'applicazione.

Quindi abbiamo due parole per la stessa cosa o ci sono differenze importanti tra codici hash e checksum?


3
Per riassumere le risposte di seguito: un codice hash riduce l'input a un numero piccolo, in un modo che riduce al minimo la possibilità di collisioni. Un checksum, d'altra parte, riduce l'input a un numero piccolo, in un modo che riduce al minimo la possibilità di collisioni. Puoi rendere un suono diverso dall'altro riformulando arbitrariamente quella descrizione.
Dan Stahlke

3
@DanStahlke - No, non è quello che dicono le risposte di seguito. Sì, entrambi riducono l'input a un numero inferiore. Ma ci sono molti, molti modi per farlo, come scegliere quale algoritmo usare? Dipende dal tuo obiettivo. Per riassumere le prime due risposte: l' obiettivo di un checksum è " rilevare gli errori più comuni ". Scegli un algoritmo che produca un checksum diverso, per qualsiasi errore sia "più comune" nel tuo scenario. Se sei preoccupato che uno o due bit vengano commutati, puoi scegliere un algoritmo che garantisca il rilevamento di quell'errore specifico! Questo è un compromesso molto specifico.
ToolmakerSteve

1
@DanStahlke - d'altra parte, il codice hash copre un'ampia gamma di possibili compromessi. Se intendiamo un valore utilizzato per creare una tabella hash, sappiamo che ci saranno collisioni, molte. Questo è un compromesso molto diverso (rispetto a un checksum). Stiamo cercando di ridurre in media le collisioni . Non garantiamo nulla. Potrebbero esserci alcuni input che differiscono di un solo bit, ma producono lo stesso hash. Questo va benissimo, se in media otteniamo una buona diffusione dei valori hash. Tuttavia sarebbe inaccettabile per un checksum.
ToolmakerSteve

Risposte:


72

Direi che un checksum è necessariamente un hashcode . Tuttavia, non tutti i codici hash fanno buoni checksum.

Un checksum ha uno scopo speciale: verifica o controlla l'integrità dei dati (alcuni possono andare oltre consentendo la correzione degli errori ). I checksum "buoni" sono facili da calcolare e possono rilevare molti tipi di danneggiamento dei dati (ad esempio uno, due, tre bit errati).

Un codice hash descrive semplicemente una funzione matematica che mappa i dati su un valore. Quando viene utilizzato come mezzo di indicizzazione in strutture di dati (ad esempio una tabella hash), è desiderabile una bassa probabilità di collisione.


6
Forse uno potrebbe essere usato come l'altro, ma considerando che hanno obiettivi di progettazione diversi, questo confonde il problema.
Wim Coenen,

8
@gumbo: no, non tutti gli hashcode sono un checksum. Vedere l'esempio di stringa da MSalters di seguito.
MarcH

41

C'è uno scopo diverso dietro ciascuno di essi:

  • Codice hash: progettato per essere casuale nel suo dominio (per ridurre al minimo le collisioni nelle tabelle hash e simili). Anche i codici hash crittografici sono progettati per essere computazionalmente impossibili da invertire.
  • Check sum: progettato per rilevare gli errori più comuni nei dati e spesso per essere veloce da calcolare (per un checksum efficace di flussi di dati veloci).

In pratica, le stesse funzioni sono spesso buone per entrambi gli scopi. In particolare, un codice hash crittograficamente forte è un buon checksum (è quasi impossibile che un errore casuale interrompa una funzione hash forte), se ci si può permettere il costo computazionale.


1
Inoltre è bene ricordare che la versione non crittografica dei codici hash può fornire un buon compromesso tra il tempo di calcolo (vicino al CRC) e il rilevamento degli errori, sia che si tratti di errore intenzionale o solo di errore di comunicazione / bit rot (non ci si può aspettare che CRC rilevi manomissioni intenzionali perché è relativamente facile progettare intenzionalmente una collisione).
gaborous

1
Per me, la frase chiave nella tua risposta è che il checksum è progettato per rilevare gli errori più comuni . Sì è quello. è un algoritmo hash che è stato scelto per produrre valori diversi per probabili corruzioni dei dati. Questo è uno scopo specifico e porta a algoritmi specifici, che ottimizzano per quello, a seconda dei tipi di perturbazioni di cui si è preoccupati.
ToolmakerSteve

22

Ci sono effettivamente alcune differenze:

  • I checksum devono solo essere diversi quando l'input è diverso (il più spesso possibile), ma è quasi altrettanto importante che siano veloci da calcolare.
  • I codici hash (da utilizzare nelle tabelle hash) hanno gli stessi requisiti e inoltre dovrebbero essere distribuiti uniformemente nello spazio del codice, soprattutto per input simili.
  • Gli hash crittografici hanno il requisito molto più rigoroso che, dato un hash, non è possibile costruire un input che produca questo hash. I tempi di calcolo sono secondari e, a seconda dell'applicazione, potrebbe anche essere desiderabile che l'hash sia molto lento da calcolare (per combattere gli attacchi di forza bruta).

1
Non penso che i checksum diversi per input diversi abbia dei vantaggi. Sono solo per verificare l'integrità, non per l'hashing.
user541686

1
@ Mehrdad: quindi come proponi di controllare l'integrità senza ottenere risultati diversi per input diversi?
Michael Borgwardt

Ehm, forse ho sbagliato a parlare di quello che ho detto? Mi riferivo alla parte in cui hai detto "per quanto possibile" - sto solo dicendo che non c'è motivo per cui siano imprevedibili o "lontani" come gli hash. Finché c'è qualche cambiamento nel checksum quando l'input subisce un cambiamento tipico, è un bel checksum. Confrontalo con gli hash, che hanno anche l'obiettivo di distribuire le cose nel modo più uniforme / casuale / imprevedibile / "lontano" possibile sul loro codominio.
user541686

Penso che tu abbia interpretato male quello che intendevo con "il più lontano possibile" - volevo solo dire che le collisioni dovrebbero essere le più rare possibile, anche se ovviamente sono inevitabili. Cambierò la formulazione.
Michael Borgwardt

@ Mehrdad - all'inizio non aveva senso per me. Se un checksum non ha una buona distribuzione sui possibili valori di checksum, significa che ci sono alcuni valori di checksum che vengono restituiti per molti più valori di input (rispetto ad altri checksum). Ma questo riduce l'utilità del checksum? [Aumenta le probabilità che i dati perturbati restituiscano lo stesso risultato, giusto?] Hmm, mi sbaglio, hai ragione: il checksum deve solo essere bravo a rilevare probabili perturbazioni. Ciò potrebbe non richiedere una distribuzione uniforme su tutti i valori.
ToolmakerSteve

10

Gli hashcode e i checksum vengono entrambi utilizzati per creare un valore numerico breve da un elemento di dati. La differenza è che un valore di checksum dovrebbe cambiare, anche se viene apportata una piccola modifica all'elemento dati. Per un valore hash, il requisito è semplicemente che gli elementi di dati del mondo reale debbano avere valori hash distinti.

Un chiaro esempio sono le stringhe. Un checksum per una stringa dovrebbe includere ogni singolo bit e l'ordine è importante. Un codice hash d'altra parte può spesso essere implementato come un checksum di un prefisso di lunghezza limitata. Ciò significherebbe che "aaaaaaaaaaba" avrebbe lo stesso hash di "aaaaaaaaaaab", ma gli algoritmi di hash possono affrontare tali collisioni.


Questa risposta è quella che suona il campanello per me. Quindi l'integrità dei dati non è al centro di un hash.
truthadjustr

9

Wikipedia lo mette bene:

Le funzioni di checksum sono correlate a funzioni hash, impronte digitali, funzioni di randomizzazione e funzioni hash crittografiche. Tuttavia, ciascuno di questi concetti ha applicazioni diverse e quindi obiettivi di progettazione diversi. Le cifre di controllo e i bit di parità sono casi speciali di checksum, appropriati per piccoli blocchi di dati (come numeri di previdenza sociale, numeri di conto bancario, parole del computer, singoli byte, ecc.). Alcuni codici di correzione degli errori si basano su checksum speciali che non solo rilevano errori comuni, ma consentono anche il ripristino dei dati originali in determinati casi.


28
Dopo averlo letto, mi chiedo ancora quale sia la differenza.
kirk.burleson

@ kirk.burleson - Direi che sono lo stesso principio , ma in pratica si fanno sempre dei compromessi . In situazioni diverse, si applicano compromessi diversi, quindi vengono utilizzati approcci diversi. Non è proprio una giustificazione per l'esistenza di due parole diverse, solo dicendo che se cerchi buone tecniche per i checksum, potresti trovare un insieme diverso di algoritmi rispetto alla ricerca di codici hash.
ToolmakerSteve

5

Un checksum protegge da modifiche accidentali.

Un hash crittografico protegge da un aggressore molto motivato.

Quando si inviano bit in rete, può accadere accidentalmente che alcuni bit vengano capovolti, eliminati o inseriti. Per consentire al destinatario di rilevare (o talvolta correggere) incidenti come questo, il mittente utilizza un checksum.

Ma se si presume che ci sia qualcuno che sta modificando attivamente e in modo intelligente il messaggio in rete e si desidera proteggersi da questo tipo di aggressore, utilizzare un hash crittografico (sto ignorando la firma crittografica dell'hash, o utilizzando un canale secondario o simile, poiché la domanda non sembra sfuggire a questo).


3
"hash crittografico" aumenta la confusione tra "hash" e "checksum". "checksum crittografico" è migliore perché non lo fa.
MarcH

5

Sebbene hash e checksum siano simili in quanto entrambi creano un valore in base al contenuto di un file, l'hashing non è la stessa cosa che creare un checksum. Un checksum ha lo scopo di verificare (controllare) l'integrità dei dati e identificare gli errori di trasmissione dei dati, mentre un hash è progettato per creare un'impronta digitale univoca dei dati.

Fonte: CompTIA ® Security + Guide to Network Security Fundamentals - Quinta edizione - Mark Ciampa -Pagina 191


4

Oggigiorno sono intercambiabili, ma un tempo un checksum era una tecnica molto semplice in cui si sommavano tutti i dati (di solito in byte) e si aggiungeva un byte alla fine con quel valore in .. allora si spera sapere se qualcuno dei dati originali era stato danneggiato. Simile a un bit di controllo, ma con byte.


4

La differenza tra codice hash e funzioni di checksum è che sono state progettate per scopi diversi.

  • Un checksum viene utilizzato per scoprire se qualcosa nell'input è cambiato.

  • Un codice hash viene utilizzato per scoprire se qualcosa nell'input è cambiato e per avere quanta più "distanza" possibile tra i singoli valori del codice hash.

    Inoltre, potrebbero esserci ulteriori requisiti per una funzione hash, in opposizione a questa regola, come la capacità di formare alberi / cluster / bucket di valori di codice hash in anticipo.

    E se si aggiunge un po 'di randomizzazione iniziale condivisa, si arriva al concetto di crittografia / scambi di chiavi moderni.


Informazioni sulla probabilità:

Ad esempio, supponiamo che i dati di input effettivamente cambino sempre (il 100% delle volte). E supponiamo di avere una funzione hash / checksum "perfetta", che genera un valore hash / checksum a 1 bit. Pertanto, otterrai diversi valori hash / checksum, il 50% delle volte, per dati di input casuali.

  • Se è cambiato esattamente 1 bit nei dati di input casuali, sarai in grado di rilevarlo il 100% delle volte, indipendentemente dalla grandezza dei dati di input.

  • Se 2 bit nei tuoi dati di input casuali sono cambiati, la tua probabilità di rilevare "una modifica" è divisa per 2, perché entrambe le modifiche potrebbero neutralizzarsi a vicenda e nessuna funzione hash / checksum rileverebbe che 2 bit sono effettivamente diversi nei dati di input .

    ...

Ciò significa che, se il numero di bit nei dati di input è più volte maggiore del numero di bit nel valore hash / checksum, la probabilità di ottenere effettivamente valori hash / checksum diversi, per valori di input diversi, viene ridotta e non è un valore costante .


2

Tendo a usare la parola checksum quando mi riferisco al codice (numerico o altro) creato per un file o un pezzo di dati che può essere utilizzato per verificare che il file oi dati non siano stati danneggiati. L'utilizzo più comune in cui mi imbatto è controllare che i file inviati attraverso la rete non siano stati alterati (deliberatamente o meno).


1
Poiché i checksum non sono difficili da annullare, ciò suggerisce che non sarebbero utili per verificare se qualcosa è stato deliberatamente alterato.
benblasdell

0

In Redis cluster data sharding, usa a hash slotper decidere quale nodo va. Prendi ad esempio l'operazione modulo di seguito:

123 % 9 = 6
122 % 9 = 5
141 % 9 = 6

La 6arriva due volte attraverso ingressi differenti. Lo scopo dell'hash è semplicemente mappare un valore di input su un valore di output e l'unicità non fa parte dell'accordo. Quindi due input diversi che producono lo stesso output vanno bene nel mondo degli hash.

Un checksum, d'altra parte, deve differire l'output anche se un bit nell'ingresso cambia perché il suo scopo non è quello di mappare, ma di rilevare il danneggiamento dei dati. Quindi due diversi input che producono lo stesso output non sono accettabili in un checksum.


-4

Un checksum è semplicemente un numero generato dal campo dati mediante oring (per addizione logica, quindi somma). Il checksum ha la capacità di rilevare un danneggiamento di qualsiasi bit o numero di bit all'interno del campo dati da cui è generato, cioè controlla gli errori che è tutto, non può correggerli. Un checksum è un hash perché la dimensione del checksum è inferiore ai dati originali. Sì, avrai delle collisioni perché il checksum non è affatto sensibile alla posizione del bit nel campo dati.

Un controllo di ridondanza ciclico (CRC) è qualcosa di completamente diverso, più complesso e NON è chiamato checksum. È l'applicazione di una serie polinomiale che ha la capacità di correggere qualsiasi numero scelto di singoli bit danneggiati all'interno del campo dati da cui è stato generato. La creazione di un CRC si traduce in un numero di dimensioni maggiori rispetto al campo dati originale (a differenza del checksum) - da qui il nome che include la parola "ridondanza" e il prezzo da pagare per la capacità di correzione degli errori. Un CRC NON è quindi un hash e non deve essere confuso o denominato come checksum, perché la ridondanza si aggiunge necessariamente alla dimensione dei dati originali.

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.