Cos’è una funzione di hash?
L’enorme aumento della quantità di dati elaborati in tutto il mondo e nelle reti dati locali solleva costantemente la seguente domanda: con che rapidità si può accedere a grandi quantità di dati e come si garantisce la sicurezza dello scambio di dati? Proprio qui scende in campo, assieme ad altre tecnologie di sicurezza, la funzione di hash. In questo articolo vi spieghiamo quali sono le sue caratteristiche e a cosa serve.
Il termine inglese “hash” significa “sminuzzare”. Tramite la funzione di hash, quindi, i dati vengono “sminuzzati” e portati a una lunghezza uniforme, indipendentemente dalla dimensione del valore di partenza. Questa funzione viene utilizzata in molti ambiti della tecnologia dell’informazione. Tra di essi troviamo, ad esempio:
- La comunicazione cifrata tra server web e browser, così come la creazione di ID di sessione per applicazioni Internet e cache di dati (caching)
- La protezione di dati sensibili come password, analisi web, metodi di pagamento
- La firma digitale dei messaggi di posta elettronica
- L’individualizzazione di set di dati uguali o simili tramite funzioni di ricerca
Funzione di hash: tramite la funzione di hash stringhe di lunghezza diversa vengono trasformate in stringhe della stessa lunghezza. Quindi, ad esempio, con la funzione di hash è possibile codificare le password in stringhe di caratteri autorizzati. Non è pero possibile riportare il valore di hash alla stringa originaria.
Quali sono le proprietà di una funzione di hash?
Una funzione di hash deve soddisfare 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 originario a partire dal valore di hash creato. Nell’esempio sopra rappresentato, non è quindi possibile risalire dal valore di hash creato “$P$Hv8rpLanTSYSA/2bP1xN.S6Mdk32.Z3” alla password “susi_562#alone”.
I valori di hash sono a prova di collisione
Non può accadere che a dati di origine diversa venga attribuito lo stesso valore di hash. Ogni inserimento deve generare un nuovo valore di hash. Se questo viene garantito, si parla anche di una funzione di hash crittografica. Nell’immagine qui sopra non sussistono valori identici, quindi nemmeno collisioni (“incidenti”) tra i dati creati. Per evitare tali collisioni i programmatori fanno uso di tecnologie avanzate.
La funzione di hash è estremamente veloce
Se la trasformazione dei dati immessi in un valore di hash richiedesse molto tempo, la procedura andrebbe considerata inadatta. La funzione di hash deve quindi funzionare in modo molto rapido. Nelle banche dati, i valori di hash vengono memorizzati nelle cosiddette 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 è irrilevante, verrà sempre emesso lo stesso numero di caratteri. Il numero di caratteri consentito 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 “fingerprint” a evidenziare l’unicità di ciascuno di questi, paragonabile a quella di un’impronta digitale. Utilizzando 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 possibilità di valori ottenibili, ciò equivale a 70 seguito da 24 zeri. Questo va a dimostrare che anche stringhe non molto lunghe creano un’impronta digitale fruibile.
I valori di hash mostrati nell’esempio qui sopra possono essere facilmente 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 corrispondente valore di hash o l’impronta digitale è sempre “3a42c503953909637f78dd8c99b3b85ddde362415585afc11901bdefe8349102“.
Funzione di hash e siti web
Nel trasferimento di dati cifrato tramite SSL, durante la richiesta al server web, il certificato del server viene inviato al browser dell’utente. Successivamente, tramite funzione di hash viene creata una chiave di sessione che viene inviata al server, dove viene poi a sua volta decifrata e verificata. 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 impossibile l’accesso non autorizzato.
Le chiavi di sessione (Session ID) vengono generate da dati variabili di una visita a un sito web, come indirizzo IP e la validazione temporale, e trasmesse tramite URL. Tali ID di sessione sono ad esempio necessari per identificare in modo univoco il carrello di un utente su un e-commerce. Al giorno d’oggi, gli ID di sessione vengono raramente trasmessi attraverso URL (vale a dire: www.domain.tld/index?sid=d4ccaf2627557c756a0762419a4b6695). È infatti molto più comune l’identificazione nell’header del sito Internet tramite cookie.
Anche l’archiviazione temporanea di informazioni 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 comunicazione tra server FTP e client funziona allo stesso modo quando si utilizza il protocollo SFTP.
Evita che venga visualizzata un'allerta nella barra degli indirizzi e ottieni la fiducia dei clienti con un sito crittografato tramite SSL.
Protezione dei dati sensibili
I dati di accesso degli account web sono bersagli amati dagli hacker. L’obiettivo è quello di interrompere il funzionamento del sito web per ridurre, ad esempio, i guadagni derivanti dalla pubblicità basata sul traffico o per raggiungere le informazioni salvate relative ai metodi di pagamento.
Dall’esempio della pagina di WordPress si deduce che una password è sempre cifrata prima di essere archiviata. In combinazione con le chiavi di sessione generate nel sistema si ottiene un elevato livello di sicurezza, importante soprattutto per proteggersi dai cosiddetti attacchi di forza bruta, nei quali un hacker prova varie combinazioni utilizzando una funzione di hash programmata autonomamente, fino a raggiungere una corrispondenza 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 utilizzate password semplici e siate sicuri di proteggere le vostre informazioni di accesso e dati di qualsiasi tipo contro l’accesso non autorizzato.
Firme digitali
Il traffico di e-mail avviene tramite server pensati appositamente per trasmettere questo tipo di messaggi. Le chiavi generate tramite funzione di hash sono anche utilizzate 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 destinatario assieme al valore di hash cifrato.
- Il destinatario a sua volta genera un valore di hash del messaggio ricevuto usando la stessa funzione di hash. Inoltre, quest’ultimo decodifica il valore di hash ricevuto con la chiave pubblica e li confronta tra loro.
- Se i due valori corrispondono, il destinatario può dedurne che il messaggio non è stato manipolato durante il percorso.
Attenzione: una firma digitale non determina la cifratura del messaggio, bensì fornisce una dimostrazione dell’integrità del messaggio stesso. I contenuti sensibili devono essere ulteriormente 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. Immaginate 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 dispendioso in termini di tempo e richiederebbe molta potenza di calcolo. Per semplificare questo processo, ogni voce della tabella può essere convertita in un unico valore di hash. Il termine di ricerca viene poi convertito anch’esso in un valore di hash. Questo limita il numero di lettere, cifre e simboli che devono essere confrontati, il che è molto più efficiente della ricerca in ogni campo che esiste nella tabella dei dati, ad esempio, di tutti i nomi che iniziano con “Ann”.
Le funzioni di hash sono utilizzate per migliorare la sicurezza nelle comunicazioni elettroniche ove gli standard di sicurezza sono sempre più sofisticati. Tuttavia, gli hacker sono costantemente aggiornati e sviluppano tecniche di attacco sempre più complesse ed avanzate.