Hashing: quali vantaggi ?
Viene spesso utilizzata per molteplici applicazioni dandola un pò per scontata, un metodo oramai consolidato, consueto. Poi ci si accorge che non proprio tutti gli addetti ai lavori conoscono bene la tecnica dell'hashing, soprattutto in termini di vantaggi e svantaggi che derivano dal suo utilizzo.
Ed allora, proviamo ad entrare un pò più nel merito.
Partiamo dall'assunto che per "HASH" si intende una funzione crittografica capace di generare dei codici univoci secondo un algoritmo matematico (hashing), noto come "valore di HASH" ma che usualmente si abbrevia in HASH.
L'hash viene anche definito come un "generato irripetibile" in quanto la tecnica di hashing utilizza sempre un algoritmo unidirezionale, per impedire che la sua conversione possa riportare al suo valore originale.
Ma come funziona l’hashing?
In maniera molto sintetica possiamo dire che l'hashing si basa su tre fattori:
Come input abbiamo i dati immessi nell’algoritmo e che possono avere qualsiasi lunghezza e formato.
Su questi dati di input la funzione di Hash applica una serie di operazioni matematiche che producono stringhe di caratteri a lunghezza fissa. A questo punto l'hash diventa garante del fatto che il dato su cui è stato applicato l'algoritmo di hash rimane immutato nel tempo. Nel caso in cui questo venisse alterato ecco che il valore dell'hash muterebbe differenziandosi dal valore originario.
Infine abbiamo l'output che, a differenza dell’input, ha una lunghezza fissa. Ciò costituisce un plus di sicurezza aggiuntivo in quanto non consente di determinare la lunghezza dell’input originale, diventando così un ostacolo difficile da superare per un hacker, nel senso che non riuscirebbe mai ad individuare il dato originario partendo dal risultato dell'hashing. Questo aspetto è molto importante per infondere sicurezza, integrità e riservatezza del dato, tanto che i valori di hash vengono spesso indicati anche come "impronte digitali".
Ed è proprio per l'integrità del dato che l'hashing trova un largo utilizzo come, ad esempio, nella trasmissione di informazioni riservate, dove viene generato un valore di hash per l'intero file o messaggio ed il tutto viene spedito al mittente che potrà poi confrontare l'hash ricevuto con il valore hash dei dati ricevuti per verificare se ci sono state alterazioni o danneggiamenti durante la trasmissione.
Ma in quali ambiti si usa la tecnica di hashing ?
Di certo il campo di applicazione più frequente dell'hashing risulta quello della sicurezza informatica.
L'esempio classico riguarda la crittografia/decrittografia di firme digitali, in genere utilizzate per autenticare i mittenti e i destinatari dei messaggi. Operazione che avviene con la trasmissione separata al mittente dell'output derivato dall'hashing della firma digitale + il valore di hash, noto come digest del messaggio. Così il mittente, in fase di ricezione, con la stessa funzione hash ricava il digest del messaggio dalla firma, che verrà poi confrontato con quello originario per garantire che entrambi siano uguali.
Questo è solo un esempio di come l'hashing giochi un ruolo fondamentale nella crittografia per tutte quelle operazioni in cui vengono utilizzati algoritmi di hashing come Secure Hash Algorithm 2 o SH-2, così come nell'autenticazione dei messaggi costituendo garanzia d’integrità e di autenticità dei dati.
Ma sono molti gli algoritmi di crittografia utilizzati in tal senso, come MD5, SHA-256, SHA-512, oppure la serie di funzioni hash message-digest MD2, MD4, MD5 e MD6, dove la firma viene trasformata in un valore più breve chiamato digest del messaggio.
Lo SHA è un algoritmo standard utilizzato per creare un digest di messaggi a 160 bit. Per certi versi risulta molto simile a MD4 che consente di ottenere risultati soddisfacenti quando viene usato per l’archiviazione e nel recupero del database, mentre non è raccomandabile per scopi crittografici o per il controllo degli errori. L'algoritmo SHA-2 e SHA3 (che è il successore) viene invece utilizzato per creare un digest di messaggi a 224 bit. In ogni caso parliamo di algoritmi che forniscono qualità e livelli di sicurezza unici e che vengono scelti ed utilizzati a seconda dei requisiti specifici dell’applicazione che ne richiede l'utilizzo
Altro caso d'uso della tecnica di hashing riguarda l'archiviazione sicura delle password. In questi casi, anzichè memorizzare le password in chiaro, le si sottopone al processo di hashing prima di essere memorizzate sullo storage. Ciò contribuisce ad elevare il livello di sicurezza in quanto se i valori di hash venissero compromessi, risulterebbe comunque computazionalmente impossibile decodificare le password originali.
La tecnica di hashing viene poi utilizzata anche per la blockchain, nelle criptovalute Bitcoin dove tutti i partecipanti hanno accesso agli stessi dati ed è fondamentale garantire l’integrità delle transazioni precedenti. In questi casi la blockchain memorizza i dati transazionali in record chiamati blocchi la cui integrità ed immutabilità vengono garantite proprio dall'hashing.
Quindi l'hashing serve solo per la sicurezza dei dati ?
Niente affatto, perchè gli algoritmi di hashing vengono anche utilizzati per organizzare i dati in bucket in modo tale da rendere la ricerca più veloce rispetto ad altre strutture dati come, ad esempio, nelle applicazioni che richiedono risultati di ricerca rapidi sui database o mediante motori di ricerca.
A proposito di database: sappiamo bene che quando dobbiamo lavorare con una grande mole di dati diventa indispensabile l'utilizzo di strutture ad indici per ottenere velocemente i dati necessari. Ed è proprio in questi casi che l’hashing potrebbe rapresentare una valida alternativa consentendo agli utenti di utilizzare una chiave di ricerca e una funzione hash piuttosto che la struttura ad indici per la ricerca dei dati, dove la funzione di hash svolge il ruolo di mapping tra le chiavi di ricerca e la posizione esatta di un record all’interno di quel determinato bucket di dati.
C'è anche qualche considerazione da fare in merito allo storage in quanto, in certe situazioni, l'hashing riesce ad ottimizzare gli spazi disco essendo i valori di hash più piccoli dei dati originali. Questa caratteristica li rende più compatti e facili da archiviare, risultando particolarmente vantaggiosi quando dobbiamo trattare grandi quantità di dati in presenza di storage limitato.
Questo si è riscontrato già nel passato quando, per risolvere il problema di archiviare e recuperare i dati in modo efficiente, venne proprio adottato l’hashing basato su sistema di Dewey, per organizzare e archiviare i libri di moltissime biblioteche nel mondo in base alla loro materia e per molti anni. Esperienza che è poi stata subito applicata all’informatica, proprio per risparmiare sia spazio che tempo sui file riducendo le risorse di dati originali e le stringhe di input in chiavi hash alfanumeriche corte.
Certo, per salvaguardare lo spazio storage si potrebbe pensare all'utilizzo della compressione dei dati. Nessun problema, perchè l'hashing riesce a fare anche questo mediante algoritmi come quello di Huffman, che realizza una compressione molto efficiente sui dai. Attenzione però in quanto è una considerazione che deve essere ponderata nella sua totalità. Infatti rimane valida se limitata ai soli valori di hash, poichè, se dobbiamo pensare alla memorizzazione di hash e dati correlati, ecco che l’hashing necessita di maggior spazio di archiviazione soprattutto quando lavoriamo con i big-data, andando così ad erodere le risorse di storage.
Poi, gli spazi di storage possono essere ottimizzati anche per le cache. Utilizzando i valori hash come chiavi, ecco che i dati possono essere recuperati rapidamente dalla memoria della cache, riducendo la necessità di accedere a sistemi di archiviazione che sono sicuramente più lenti, ottenendo quindi tempi di risposta migliori con prestazioni più elevate dei sistemi.
Ma ci sono svantaggi nell'uso dell'hashing ?
Ebbene, l'hashing presenta sicuramente alcune limitazioni. Una su tutte: il rischio di collisioni che si possono verificare quando due input diversi producono lo stesso valore di hash.
Le collisioni possono portare a una diminuzione delle prestazioni e ad un aumento del tempo di ricerca, soprattutto se il loro numero risulta elevato. E' anche ero che esistono delle tecniche come il concatenamento e l’indirizzamento aperto che possono essere utilizzate per gestire le collisioni, ma allo stesso tempo introducono una maggior complessità.
Altra nota che potrebbe non risultare gradita è quella relativa alla unidirezionalità del processo di hashing che risulta quindi irreversibile. A volte, questa caratteristica, potrebbe rappresentare fastidiosa, soprattutto in quei casi in cui è necessario effettuare ricerche e processi inversi per ottenere i dati di input originali.
Poi l'hashing non è consigliabile quando i dati devono essere ordinati in un ordine specifico. Seppure le tabelle hash vengono progettate per una ricerca e un recupero efficiente dei dati, le stesse tabelle però non forniscono un supporto intrinseco per le operazioni di ordinamento. In presenza di un requisito di ordinamento ecco che potrebbe valere la pena di considerare altre strutture di dati più consone allo scopo. Senza considerare che la configurazione di una tabella hash o di un algoritmo di hashing può risultare più difficile rispetto ad altre strutture dati.
Infine l’hashing dipende fortemente dall’unicità delle chiavi per poter garantire un recupero efficiente dei dati. Se le chiavi non sono uniche, le collisioni possono verificarsi più frequentemente, portando al degrado delle prestazioni. Perciò risulta fondamentale generare attentamente le chiavi in modo da ridurre al minimo la probabilità di rischio di collisioni.
In conclusione, come tutte le soluzioni informatiche, la tecnica di hashing può presentare vantaggi e svantaggi che devono essere ben valutati in correlazione con l'obiettivo che si vuole raggiungere. Sta a noi la scelta...