Domanda

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.

vale a dire. La probabilità che due blocchi di dati producano lo stesso valore numerico di hash / checksum è abbastanza 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?

È stato utile?

Soluzione

Direi che un checksum è necessariamente a hashcode . Tuttavia, non tutti gli hashcode fanno buoni checksum.

Un checksum ha uno scopo speciale --- verifica o controlla l'integrità dei dati (alcuni possono andare oltre quello consentendo correzione errori ). & Quot; Good " i checksum sono facili da calcolare e possono rilevare molti tipi di corruzione dei dati (ad esempio uno, due, tre bit errati).

Un hashcode descrive semplicemente una funzione matematica che mappa i dati su un certo valore. Se utilizzato come mezzo di indicizzazione nelle strutture di dati (ad esempio una tabella hash), è auspicabile una bassa probabilità di collisione.

Altri suggerimenti

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). I codici hash crittografici sono inoltre progettati per essere computazionalmente impossibile da invertire.
  • Verifica somma: progettata per rilevare gli errori più comuni nei dati e spesso per essere rapida da calcolare (per un efficace controllo dei flussi veloci di dati).

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 forte funzione hash), se puoi permetterti il ??costo computazionale.

Ci sono davvero 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 (per l'uso in hashtables) hanno gli stessi requisiti e inoltre dovrebbero essere distribuiti uniformemente nello spazio del codice, in particolare per input simili.
  • Gli hash crittografici hanno il molto requisito più rigoroso che dato un hash, non è possibile costruire un input che produce questo hash. I tempi di calcolo sono secondi e, a seconda dell'applicazione, potrebbe anche essere desiderabile che l'hash sia molto lento da calcolare (al fine di combattere gli attacchi di forza bruta).

Wikipedia dice bene:

  

Le funzioni di checksum sono correlate all'hash   funzioni, impronte digitali, randomizzazione   funzioni e hash crittografico   funzioni. Tuttavia, ognuno di quelli   concetti ha diverse applicazioni   e quindi diversi obiettivi di design.   Controllare cifre e bit di parità sono   casi speciali di checksum,   appropriato per piccoli blocchi di dati   (come numeri di previdenza sociale, banca   numeri di conto, parole del computer,   byte singoli, ecc.). Alcuni   i codici di correzione degli errori si basano su   checksum speciali che non solo rilevano   errori comuni ma consentono anche il   dati originali in cui recuperare   alcuni casi.

Hashcodes e checksum sono entrambi usati per creare un breve valore numerico 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. D'altra parte un hashcode può spesso essere implementato come checksum di un prefisso di lunghezza limitata. Ciò significherebbe che "aaaaaaaaaaba" avrebbe lo stesso hash di "aaaaaaaaaaab", ma gli algoritmi di hash possono gestire tali collisioni.

In questi giorni sono intercambiabili, ma in passato un checksum era una tecnica molto semplice in cui si sommavano tutti i dati (di solito in byte) e si puntava un byte alla fine con quel valore in .. quindi si speriamo di sapere se qualcuno dei dati originali è stato danneggiato. Simile a un bit di controllo, ma con byte.

Un checksum protegge da modifiche accidentali.

Un hash crittografico protegge da un aggressore molto motivato.

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

Ma se supponi che ci sia qualcuno che modifica attivamente e in modo intelligente il messaggio sul filo e vuoi proteggerti da questo tipo di attaccante, allora usa un hash crittografico (sto ignorando la crittografia firmando l'hash, o usando un canale secondario o tale, poiché la domanda non sembra sfuggire a questo).

La differenza tra le funzioni hash-code e 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 la stessa "distanza" tra i singoli valori di codice hash possibile.

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

    E se aggiungi qualche randomizzazione iniziale condivisa, arrivi al concetto di crittografia / scambio di chiavi moderni.


Informazioni sulla probabilità:

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

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

  • Se 2 bit nei dati di input casuali sono cambiati, la probabilità di rilevare "una modifica" è diviso per 2, perché entrambe le modifiche potrebbero neutralizzarsi a vicenda e nessuna funzione hash / checksum rileverà 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 è una costante .

Tendo a usare la parola checksum quando mi riferisco al codice (numerico o di altro tipo) creato per un file o un pezzo di dati che può essere usato per controllare che il file o i dati non sono stati danneggiati . L'uso più comune che ho riscontrato è quello di verificare che i file inviati attraverso la rete non siano stati modificati (deliberatamente o in altro modo).

  

Sebbene hashing e checksum siano simili in quanto entrambi creano un valore basato sul contenuto di un file, l'hash non è lo stesso di   creando un checksum. Un checksum ha lo scopo di verificare (controllare) il   integrità dei dati e identificazione degli errori di trasmissione dei dati, mentre un hash   è progettato per creare un'impronta digitale unica dei dati.

Fonte: CompTIA & # 174; Sicurezza + Guida ai fondamenti di sicurezza della rete - Quinta edizione - Mark Ciampa -Pagina 191

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top