(w)Hashing Machine

(w)Hashing Machine

Introduzione

Nel contesto della confidenzialità dei dati nell’informatica, il termine ”criptazione” è spesso utilizzato per indicare il processo di modifica di un oggetto da segretare mediante un algoritmo e una chiave di codifica. Tuttavia, le funzioni di hash forniscono un effetto simile con un procedimento diverso.

Funzionamento

Le funzioni di hash sono funzioni che prendono in input un messaggio di lunghezza variabile e producono un output di lunghezza prefissato.

h = H(m)

  • m: input del messaggio di qualsiasi dimensione
  • h: output fisso di lunghezza
  • L’output h è chiamato “message digest” (digest).

In aggiunta a queste proprietà è importante annotare una regola importantissima per il suo corretto funzionamento:

Ogni input diverso genera un output differente, anche se cambia solo un bit di input. La trasformazione è univoca, quindi non esiste alcun modo di risalire all’input dal digest generato.

Vantaggi

Il costo computazionale per il calcolo di un hash è molto basso rispetto a quello di criptare il messaggio. questo rende più efficiente l’utilizzo delle funzioni di hash, se ovviamente il fine è uguale.

Per esempio le funzioni di hash sono molto utilizzate per il salvataggio delle password a database. Quando un utente tenta il login con delle credenziali (e.g user/password), il confronto delle password non è fatto in chiaro; bensì si hasha la password inserita nel form di login e si confronta con la password hashata a database.

L’unico modo in cui i due digest siano uguali è che i dati in input siano equivalenti, quindi cosi facendo possiamo controllare le password degli utenti garantendo la confidenzialità dei loro dati e allo stesso tempo rendendo efficiente il codice di controllo.

L’utilizzo degli hash è usato in molti altri processi dell’informatica, tra cui anche La firma digitale, il concetto di base è sempre il controllo dei digest per verificare l’integrità e/o la congruenza dei messaggi; e questo può essere utile anche quando si vogliono ricercare malware, che possono essere controllati se corrispondono ad hash di eseguibili malevoli già noti

Tallone d’Achille

Le basi concettuali delle funzioni di hash risiedono nel fatto che il processo è completamente univoco. In altre parole, se l’algoritmo è valido, il risultato sarà sempre lo stesso. Tuttavia, nel corso degli anni, è emerso un vasto database contenente i ”digest” di varie parole, consentendo agli utenti malevoli di risalire alle password hashate se il corrispondente record è presente in tali database.

Un esempio di sito che permette di verificare hash generati da algoritmi comuni è Crack Station. Questo fenomeno sottolinea l’importanza di mantenere aggiornate le password. È cruciale evitare scelte deboli come “password123”, poiché tali stringhe sono spesso incluse in liste di password comuni utilizzate dagli aggressori.

Fortunatamente, esiste una contro-misura per affrontare questa vulnerabilità: l’implementazione della tecnica del ”salt”. Il salt è una stringa di lunghezza variabile che viene aggiunta alla stringa da hashare. Questo stratagemma consente di generare un numero estremamente elevato di combinazioni, rendendo impraticabile il tentativo di calcolare tutte le possibili varianti. Quindi, come nella preparazione di un piatto di pasta, anche nell’uso delle funzioni di hash, è essenziale ricordarsi di aggiungere il giusto ”sale” per garantire una sicurezza robusta. 🧂

Esempio di Salt in Laravel

In Laravel, quando si utilizza la funzione Hash::make($password), il framework si occupa automaticamente di generare un salt casuale e incorporarlo nel risultato hash. Tuttavia, il salt non viene memorizzato separatamente dal risultato hash. Invece, è incluso nel risultato hash stesso.

Il formato del risultato hash prodotto da Laravel utilizzando Bcrypt include sia il salt che il valore hash. Ad esempio:

$2y$10$VJfTnrSmSdqXW8yN9rPZZeMUcYP.aYklAQ.OCPEOec4TkU8k/D13a

$2y$10$ indica l’algoritmo Bcrypt e il costo del calcolo (10 è il costo di default in Laravel). VJfTnrSmSdqXW8yN9rPZZe è il salt. MUcYP.aYklAQ.OCPEOec4TkU8k/D13a è il risultato hash.

Il salt è integrato nel risultato hash, e durante la verifica della password ( usando Hash::check($input_password, $stored_hash)), Laravel estrae automaticamente il salt dal risultato hash per effettuare la verifica corretta.

Algoritmi Comuni di Hashing

  1. MD5 (Message Digest Algorithm 5):
  • Comunemente utilizzato per checksum e verifica dell’integrità.
  • Produce un valore di hash a 128 bit (32 caratteri).
  1. SHA-1 (Secure Hash Algorithm 1):
  • Originariamente progettato per la sicurezza crittografica.
  • Produce un valore di hash a 160 bit (40 caratteri).
  • Deprecato per applicazioni sensibili alla sicurezza a causa di vulnerabilità.
  1. SHA-256 (Secure Hash Algorithm 256-bit):
  • Parte della famiglia SHA-2.
  • Produce un valore di hash a 256 bit (64 caratteri).
  • Ampiamente utilizzato nella tecnologia blockchain e in altre applicazioni di sicurezza.
  1. SHA-3 (Secure Hash Algorithm 3):
  • L’ultimo membro della famiglia Secure Hash Algorithm.
  • Fornisce lunghezze di hash simili a SHA-2 (224, 256, 384, 512 bit).
  • Progettato per essere più sicuro contro determinati tipi di attacchi.