L’enorme aumento della quantità di dati elaborati in tutto il mondo e nelle reti dati locali solleva co­stan­te­men­te la seguente domanda: con che rapidità si può accedere a grandi quantità di dati e come si ga­ran­ti­sce la sicurezza dello scambio di dati? Proprio qui scende in campo, assieme ad altre tec­no­lo­gie di sicurezza, la funzione di hash. In questo articolo vi spie­ghia­mo quali sono le sue ca­rat­te­ri­sti­che e a cosa serve.

Il termine inglese “hash” significa “smi­nuz­za­re”. Tramite la funzione di hash, quindi, i dati vengono “smi­nuz­za­ti” e portati a una lunghezza uniforme, in­di­pen­den­te­men­te dalla di­men­sio­ne del valore di partenza. Questa funzione viene uti­liz­za­ta in molti ambiti della tec­no­lo­gia dell’in­for­ma­zio­ne. Tra di essi troviamo, ad esempio:

  • La co­mu­ni­ca­zio­ne cifrata tra server web e browser, così come la creazione di ID di sessione per ap­pli­ca­zio­ni Internet e cache di dati (caching)
  • La pro­te­zio­ne di dati sensibili come password, analisi web, metodi di pagamento
  • La firma digitale dei messaggi di posta elet­tro­ni­ca
  • L’in­di­vi­dua­liz­za­zio­ne di set di dati uguali o simili tramite funzioni di ricerca
De­fi­ni­zio­ne

Funzione di hash: tramite la funzione di hash stringhe di lunghezza diversa vengono tra­sfor­ma­te in stringhe della stessa lunghezza. Quindi, ad esempio, con la funzione di hash è possibile co­di­fi­ca­re le password in stringhe di caratteri au­to­riz­za­ti. Non è pero possibile riportare il valore di hash alla stringa ori­gi­na­ria.

Quali sono le proprietà di una funzione di hash?

Una funzione di hash deve sod­di­sfa­re dei requisiti definiti, in modo tale da avere le seguenti proprietà:

La funzione di hash è a senso unico

Non è possibile tornare al contenuto dei dati ori­gi­na­rio a partire dal valore di hash creato. Nell’esempio sopra rap­pre­sen­ta­to, non è quindi possibile risalire dal valore di hash creato “$P$Hv8rpLan­TSY­SA/2bP1xN.S6Mdk32.Z3” alla password “susi_562#alone”.

I valori di hash sono a prova di col­li­sio­ne

Non può accadere che a dati di origine diversa venga at­tri­bui­to lo stesso valore di hash. Ogni in­se­ri­men­to deve generare un nuovo valore di hash. Se questo viene garantito, si parla anche di una funzione di hash crit­to­gra­fi­ca. Nell’immagine qui sopra non sus­si­sto­no valori identici, quindi nemmeno col­li­sio­ni (“incidenti”) tra i dati creati. Per evitare tali col­li­sio­ni i pro­gram­ma­to­ri fanno uso di tec­no­lo­gie avanzate.

La funzione di hash è estre­ma­men­te veloce

Se la tra­sfor­ma­zio­ne dei dati immessi in un valore di hash ri­chie­des­se molto tempo, la procedura andrebbe con­si­de­ra­ta inadatta. La funzione di hash deve quindi fun­zio­na­re in modo molto rapido. Nelle banche dati, i valori di hash vengono me­mo­riz­za­ti nelle co­sid­det­te tabelle di hash per garantire un accesso rapido.

Cos’è il valore di hash creato?

Il valore di hash è la stringa a lunghezza fissa generata dalla funzione di hash. La quantità di caratteri del valore immesso è ir­ri­le­van­te, verrà sempre emesso lo stesso numero di caratteri. Il numero di caratteri con­sen­ti­to viene stabilito all’interno della funzione stessa.

Perciò il valore di hash è il risultato calcolato tramite la funzione di hash e un algoritmo di hash. Per indicare il valore di hash si utilizza anche il termine “fin­ger­print” a evi­den­zia­re l’unicità di ciascuno di questi, pa­ra­go­na­bi­le a quella di un’impronta digitale. Uti­liz­zan­do le lettere minuscole da “a” a “f” e i numeri da “0” a “9”, nel caso di un valore di hash della lunghezza di 64 caratteri, esistono 1.1579209e+77 pos­si­bi­li­tà di valori ot­te­ni­bi­li, ciò equivale a 70 seguito da 24 zeri. Questo va a di­mo­stra­re che anche stringhe non molto lunghe creano un’impronta digitale fruibile.

I valori di hash mostrati nell’esempio qui sopra possono essere fa­cil­men­te creati con poche righe di codice PHP.

<?php
echo hash(‘sha256’, ‘apple’); 
?>

Qui si utilizza l’algoritmo di cifratura "SHA256" per calcolare il valore di ingresso "apple". Il cor­ri­spon­den­te valore di hash o l’impronta digitale è sempre “3a42c503953909637f78dd8c99b3b85ddde362415585afc11901bdefe8349102“.

Funzione di hash e siti web

Nel tra­sfe­ri­men­to di dati cifrato tramite SSL, durante la richiesta al server web, il cer­ti­fi­ca­to del server viene inviato al browser dell’utente. Suc­ces­si­va­men­te, tramite funzione di hash viene creata una chiave di sessione che viene inviata al server, dove viene poi a sua volta decifrata e ve­ri­fi­ca­ta. Quando il server conferma la chiave di sessione ricevuta, si avvia il traffico dati cifrato HTTP, ossia come HTTPS. Anche i pacchetti dati scambiati sono cifrati, rendendo quasi im­pos­si­bi­le l’accesso non au­to­riz­za­to.

Le chiavi di sessione (Session ID) vengono generate da dati variabili di una visita a un sito web, come indirizzo IP e la va­li­da­zio­ne temporale, e trasmesse tramite URL. Tali ID di sessione sono ad esempio necessari per iden­ti­fi­ca­re in modo univoco il carrello di un utente su un e-commerce. Al giorno d’oggi, gli ID di sessione vengono raramente trasmessi at­tra­ver­so URL (vale a dire: www.domain.tld/index?sid=d4ccaf2627557c756a0762419a4b6695). È infatti molto più comune l’iden­ti­fi­ca­zio­ne nell’header del sito Internet tramite cookie.

Anche l’ar­chi­via­zio­ne tem­po­ra­nea di in­for­ma­zio­ni nelle cache avviene tramite valori di hash cifrati. In questo modo gli utenti che non ne hanno i diritti, una volta visionata la cache, non possono risalire ai siti Internet visitati o estrarre i dati di accesso o pagamento.

La co­mu­ni­ca­zio­ne tra server FTP e client funziona allo stesso modo quando si utilizza il pro­to­col­lo SFTP.

Cer­ti­fi­ca­to SSL
Proteggi il tuo sito con un cer­ti­fi­ca­to SSL

Evita che venga vi­sua­liz­za­ta un'al­ler­ta nella barra degli indirizzi e ottieni la fiducia dei clienti con un sito crit­to­gra­fa­to tramite SSL.

Pro­te­zio­ne dei dati sensibili

I dati di accesso degli account web sono bersagli amati dagli hacker. L’obiettivo è quello di in­ter­rom­pe­re il fun­zio­na­men­to del sito web per ridurre, ad esempio, i guadagni derivanti dalla pub­bli­ci­tà basata sul traffico o per rag­giun­ge­re le in­for­ma­zio­ni salvate relative ai metodi di pagamento.

Dall’esempio della pagina di WordPress si deduce che una password è sempre cifrata prima di essere ar­chi­via­ta. In com­bi­na­zio­ne con le chiavi di sessione generate nel sistema si ottiene un elevato livello di sicurezza, im­por­tan­te so­prat­tut­to per pro­teg­ger­si dai co­sid­det­ti attacchi di forza bruta, nei quali un hacker prova varie com­bi­na­zio­ni uti­liz­zan­do una funzione di hash pro­gram­ma­ta au­to­no­ma­men­te, fino a rag­giun­ge­re una cor­ri­spon­den­za che permetta l’accesso. L’utilizzo di password lunghe con elevati standard di sicurezza rende il successo di questi attacchi meno probabile, poiché la potenza di calcolo richiesta è molto più elevata. Ancora un consiglio: non uti­liz­za­te password semplici e siate sicuri di pro­teg­ge­re le vostre in­for­ma­zio­ni di accesso e dati di qualsiasi tipo contro l’accesso non au­to­riz­za­to.

Firme digitali

Il traffico di e-mail avviene tramite server pensati ap­po­si­ta­men­te per tra­smet­te­re questo tipo di messaggi. Le chiavi generate tramite funzione di hash sono anche uti­liz­za­te per firmare i messaggi in modo digitale.

Di seguito come si svolge l’invio di un messaggio con firma digitale:

  • Il mittente converte il suo messaggio in un valore di hash e lo codifica usando la sua chiave privata. Questo valore hash cifrato è la firma digitale.
  • Il messaggio viene inviato al de­sti­na­ta­rio assieme al valore di hash cifrato.
  • Il de­sti­na­ta­rio a sua volta genera un valore di hash del messaggio ricevuto usando la stessa funzione di hash. Inoltre, quest’ultimo de­co­di­fi­ca il valore di hash ricevuto con la chiave pubblica e li confronta tra loro.
  • Se i due valori cor­ri­spon­do­no, il de­sti­na­ta­rio può dedurne che il messaggio non è stato ma­ni­po­la­to durante il percorso.

At­ten­zio­ne: una firma digitale non determina la cifratura del messaggio, bensì fornisce una di­mo­stra­zio­ne dell’integrità del messaggio stesso. I contenuti sensibili devono essere ul­te­rior­men­te cifrati.

Come può aiutare la funzione di hash nelle funzioni di ricerca?

La ricerca tra grandi quantità di dati è una procedura che richiede l’impiego di molte risorse. Im­ma­gi­na­te di avere una tabella che elenchi ogni abitante di una grande città, con molti campi diversi per ogni voce (nome, cognome, indirizzo, ecc.). Trovare un solo termine sarebbe molto di­spen­dio­so in termini di tempo e ri­chie­de­reb­be molta potenza di calcolo. Per sem­pli­fi­ca­re questo processo, ogni voce della tabella può essere con­ver­ti­ta in un unico valore di hash. Il termine di ricerca viene poi con­ver­ti­to anch’esso in un valore di hash. Questo limita il numero di lettere, cifre e simboli che devono essere con­fron­ta­ti, il che è molto più ef­fi­cien­te della ricerca in ogni campo che esiste nella tabella dei dati, ad esempio, di tutti i nomi che iniziano con “Ann”.

In sintesi

Le funzioni di hash sono uti­liz­za­te per mi­glio­ra­re la sicurezza nelle co­mu­ni­ca­zio­ni elet­tro­ni­che ove gli standard di sicurezza sono sempre più so­fi­sti­ca­ti. Tuttavia, gli hacker sono co­stan­te­men­te ag­gior­na­ti e svi­lup­pa­no tecniche di attacco sempre più complesse ed avanzate.

Vai al menu prin­ci­pa­le