Funzioni di Hash e Digest

Funzioni di Hash e Digest

Funzione di Hash

La funzione crittografica di hash o più spesso funzione di hash è una funzione non invertibile che mappa una stringa di lunghezza arbitraria (messaggio) in una stringa di lunghezza predefinita e quindi fissa valore di hash, impronta del messaggio o somma di controllo, ma spesso anche con il termine inglese Digest. Gli algoritmi usati a questo proposito sono unidirezionali (one-way), quindi difficili da invertire, questo permette alle funzioni crittografiche di hash di trovare ampio utilizzo negli ambiti di sicurezza informatica come: nelle firme digitali, autenticazione dei messaggi oppure come per la crittografia delle credenziali private degli utenti nelle applicazioni rivolte al web.

Proprietà della funzione Hash

La maggior parte delle funzioni di hash sono progettate per prendere in input una stringa di qualsiasi lunghezza e produrre in output un valore di hash di lunghezza fissa. Per resistere ad attacchi nelle applicazioni crittografiche basati sulla crittoanalisi la funzione hash deve rispettare le seguenti proprietà:

  • Resistenza alla preimmagine: sia computazionalmente intrattabile la ricerca di una stringa in input che dia un hash uguale a un dato hash. Pertanto, dato un valore di hash h deve essere difficile risalire ai vari messaggi m con hash(m) = h. questa proprietà deriva dal concetto di funzione unidirezionale.
  • Resistenza alla seconda preimmagine: sia computazionalmente intrattabile la ricerca di una stringa in input che dia un hash uguale a quello di una data stringa. Perciò, dato un input m1 deve essere estremamente difficile trovare un secondo input m2 tale che hash(m1) = hash(m2).
  • Resistenza alle collisioni: sia computazionalmente intrattabile la ricerca di una coppia di stringhe in input che diano lo stesso hash. Di conseguenza, dati due messaggi m1 ed m2 deve essere difficile che i due messaggi abbiano lo stesso hash (collisione).

Algoritmo di hash

L’algoritmo di hash elabora qualunque mole di bit. Si tratta di una famiglia di algoritmi che soddisfa questi requisiti:

  1. L’algoritmo restituisce una stringa di numeri e lettere a partire da un qualsiasi flusso di bit di qualsiasi dimensione (può essere un file ma anche una stringa). L’output è detto Digest.
  2. L’algoritmo non è invertibile, ossia non è possibile ricostruire il documento originale a partire dalla stringa che viene restituita in output ovvero è una funzione unidirezionale, quest’ultima caratteristica non è indispensabile se si usano gli hash per controllare gli errori nei trasferimenti dei dati, dove le eventuali funzioni di criptaggio possono venir svolte in altre aree del protocollo.

Hash e collisioni

Ad almeno un hash corrisponderanno più testi possibili. Quando due testi producono lo stesso hash, si parla di collisione, e la qualità di una funzione di hash è misurata direttamente in base alla difficoltà nell’individuare due testi che generino una collisione. Un hash crittograficamente sicuro non dovrebbe permettere di risalire, in un tempo confrontabile con l’utilizzo dell’hash stesso, ad un testo che possa generarlo. Le funzioni hash ritenute più resistenti richiedono attualmente un tempo di calcolo per la ricerca di una collisione superiore alla durata dell’universo.

Sicurezza delle funzioni hash

Nel contesto delle funzioni hash, ci si riferisce a due diversi concetti di sicurezza:

  1. Sicurezza debole: dato un messaggio M, è computazionalmente “difficile” trovare un secondo messaggio M’ tale che h(M)=h(M’).
  2. Sicurezza forte: è computazionalmente difficile trovare una coppia di messaggi M, M’ tali che h(M)=h(M’).

Questi due tipi di sicurezza vengono distinti anche per via degli effetti che essi possono produrre nel caso in cui ne siano privi: per quanto riguarda ad esempio la possibilità di effettuare una firma digitale, un algoritmo che non garantisca la sicurezza forte, ma quella debole, sarebbe comunque utile dal momento che il messaggio M non può essere “controllato” e bisognerebbe quindi trovare un secondo messaggio M’ con uguale funzione di hash, il che sarebbe appunto computazionalmente difficile.

Applicazioni della funzione Hash

La lunghezza dei valori di hash varia a seconda degli algoritmi utilizzati. Il valore più comunemente adottato è di 128 bit, che offre una buona affidabilità in uno spazio relativamente ridotto. Tuttavia va registrata la possibilità d’uso di hash di dimensione maggiore (SHA, ad esempio, può anche fornire stringhe di 224, 256, 384 e 512 bit) e minore (che però è fortemente sconsigliato).

Le funzioni hash svolgono un ruolo essenziale nella crittografia infatti esse sono utili per verificare l’integrità di un messaggio, poiché l’esecuzione dell’algoritmo su un testo anche minimamente modificato fornisce un message digest completamente differente rispetto a quello calcolato sul testo originale, rivelando la tentata modifica. Si specifichino dunque le applicazioni più comuni della funzione di Hash.

Verifica dell’integrità di un messaggio

Un’importante applicazione delle funzioni crittografiche di hash è nella verifica dell’integrità di un messaggio. Infatti grazie alle proprietà di queste funzioni è possibile verificare se sono stati compiute modifiche al messaggio confrontando il suo hash prima e dopo la trasmisione. Per questo motivo l’hash di un messaggio viene anche detto impronta digitale del messaggio.

Verifica delle password

Nelle applicazioni che necessitano autentificazione è troppo rischioso salvare le password di tutti gli utenti in chiaro, cioè su un file non cifrato, soprattutto nel caso in cui esso venga compromesso. Un modo per ridurre questo rischio è di salvarne l’hash di ogni password e confrontare quindi questi ad ogni autentificazione.

Proof-of-Work

Il proof-of-work è una misura economica per scoraggiare attacchi di tipo denial of service e altri abusi di servizio, come spam sulla rete, imponendo alcuni lavori dal richiedente del servizio, di solito intendendo tempo di elaborazione di un computer. Un sistema famoso, usato anche nella creazione di bitcoin, usa inversioni di hash parziali per verificare che il lavoro sia fatto.

Identificativo di File o Dati

Un’altra applicazione in cui queste funzioni sono utilizzate è l’identificazione di file. Le applicazioni che necessitano gestire grandi quantitativi di dati e file come: software di controllo di versione, reti peer-to-peer e database, utilizzano funzioni di hash per generare codici univoci per ogni file semplificando quindi la loro identificazione e ricerca. A questo scopo però la computazione richiesta dalle funzioni crittografiche di hash è un po’ più elevata rispetto a quella delle funzioni di hash, per questo motivo si preferisce usarle in contesti dove la protezione dei dati ad attacchi è fondamentale.

Generazione di numeri pseudocasuali e chiavi di derivazione

Le funzioni di hash possono essere impiegate anche per la generazione di stringhe pseudorandom o per la derivazione di chiavi e password da una singola chiave o password sicura.

Il Digest

Il Digest è una stringa di caratteri univoca che risulta dall’applicazione della funzione di Hash al testo del messaggio. Non è possibile risalire dal suo valore al testo che l’ha originato. Chi riceve un messaggio con Digest, applicando lo stesso hashing, deve ottenere lo stesso Digest, altrimenti significa che il corpo del messaggio è stato alterato.

Il digest può essere rappresentato nel seguente modo: Digest=H(testo)

dove:

  • H: rappresenta la funzione di hashing applicata al testo;
  • testo: rappresenta il contenuto del messaggio di di cui si vuole calcolare il digest e non esiste nessuna corrispondenza biunivoca tra l’hash e il testo

Il Digest garantisce l’integrità del messaggio ovvero la protezione dei dati e delle informazioni nei confronti delle modifiche del contenuto, accidentali oppure effettuate da una terza parte, in cui è compreso anche il caso limite della generazione ex novo di dati ed informazioni.

Standard principali

  • SHA
  • MD5

Integrità

Precedente La Crittografia Successivo Cifratura a blocchi

Lascia un commento

*