• auth
  • password
  • sicurezza
  • hashing
  • bcrypt
  • argon2
  • sha1
  • sha2
  • login
  • accesso

L'evoluzione dell'hashing delle password

Potresti aver sentito consigli per la scelta degli algoritmi di hashing della password, ma ti sei mai chiesto perché sono raccomandati? In questo articolo, esploreremo l'evoluzione degli algoritmi di hashing delle password e le ragioni dietro di essi.

Gao
Gao
Founder

Introduzione

L'hashing delle password, come suggerisce il nome, è il processo di calcolo di un valore hash da una password. Il valore hash è tipicamente conservato in un database e durante il processo di login (accesso), il valore hash della password inserita dall'utente viene calcolato e confrontato con il valore hash memorizzato nel database. Se corrispondono, l'utente è autenticato.

Prima di tuffarci nell'evoluzione degli algoritmi di hashing delle password, è importante capire perché sia necessario.

Password in chiaro: un rischio notevole per la sicurezza

Immagina di essere un utente di un sito web dove hai registrato un account. Un giorno, il sito web viene violato e il database viene divulgato. Se il sito web conserva le password in chiaro, l'hacker può accedere direttamente alla tua password. Dal momento che molte persone riutilizzano le password su diversi siti web, l'hacker può utilizzare questa password per accedere non autorizzato ai tuoi altri account. La situazione peggiora se utilizzi la stessa o una password simile per il tuo account di posta elettronica, poiché l'hacker può reimpostare la tua password e prendere il controllo di tutti i tuoi account associati.

Anche senza una violazione dei dati, nei grandi team, chiunque abbia accesso al database può vedere le password. A differenza di altre informazioni, le password sono altamente sensibili e non vuoi assolutamente che nessuno abbia accesso ad esse.

Conservare le password senza hashing è un errore da principianti. Purtroppo, se cerchi "password leak plaintext", scoprirai che grandi aziende come Facebook, DailyQuiz, e GoDaddy hanno tutte esperito perdite di password in plaintext. È probabile che molte altre aziende abbiano commesso lo stesso errore.

Codifica v.s. crittografia v.s. hashing

Questi tre termini vengono spesso confusi, ma sono concetti distinti.

Codifica

La codifica è la prima cosa da escludere per la conservazione delle password. Per esempio, Base64 è un algoritmo di codifica che converte dati binari in una stringa di caratteri:

Conoscere l'algoritmo di codifica consente a chiunque di decodificare la stringa codificata e recuperare i dati originali:

Per gli hacker, la maggior parte degli algoritmi di codifica equivalgono al plaintext.

Criptazione

Prima che l'hashing prendesse piede, la crittografia era usata per lo storage delle password, come con AES. La crittografia implica l'uso di una chiave (o di una coppia di chiavi) per criptare e decriptare i dati.

Il problema con la crittografia è evidente nel termine "decriptare". La crittografia è reversibile, il che significa che se un hacker ottiene la chiave, può decrittare la password e recuperare la password in chiaro.

Hashing

La differenza principale tra hashing, codifica e crittografia è che l'hashing è irreversibile. Una volta che una password viene hashata, non può essere decriptata per ritornare alla sua forma originale.

Come proprietario di un sito web, non hai realmente bisogno di conoscere la password stessa, finché gli utenti possono accedere con la password corretta. Il processo di registrazione può essere semplificato come segue:

  1. L'utente inserisce la password.
  2. Il servizio utilizza un algoritmo di hashing per calcolare il valore hash della password.
  3. Il servizio conserva il valore hash nel database.

Quando l'utente accede, il processo è:

  1. L'utente inserisce la password.
  2. Il servizio utilizza lo stesso algoritmo di hashing per calcolare il valore hash della password.
  3. Il servizio confronta il valore hash con il valore hash conservato nel database.
  4. Se i valori hash corrispondono, l'utente è autenticato.

Entrambi i processi evitano di conservare le password in chiaro e, poiché l'hashing è irreversibile, anche se il database è compromesso, l'hacker può ottenere solo valori hash che appaiono come stringhe casuali.

Il kit di partenza degli algoritmi di hashing

L'hashing può sembrare la soluzione perfetta per la conservazione delle password, ma non è così semplice. Per capire perché, esploriamo l'evoluzione degli algoritmi di hashing delle password.

MD5

Nel 1992, Ron Rivest ha progettato l'algoritmo MD5, un algoritmo di digest dei messaggi che può calcolare un valore hash di 128 bit da qualsiasi dato. MD5 è stato ampiamente usato in vari campi, incluso l'hashing delle password. Ad esempio, il valore hash MD5 di "123456" è:

Come accennato in precedenza, il valore hash appare come una stringa casuale ed è irreversibile. Inoltre, MD5 è veloce e facile da implementare, rendendolo l'algoritmo di hashing delle password più popolare.

Tuttavia, i vantaggi di MD5 sono anche le sue debolezze nell'hashing delle password. La sua velocità lo rende vulnerabile agli attacchi a forza bruta. Se un hacker possiede una lista di password comuni e le tue informazioni personali, può calcolare il valore hash MD5 di ogni combinazione e confrontarli con i valori hash nel database. Ad esempio, potrebbe combinare il tuo compleanno con il tuo nome o il nome del tuo animale domestico.

Oggi, i computer sono significativamente più potenti di prima, rendendo facile forzare le password MD5 hashate.

SHA family

Allora, perché non usare un algoritmo diverso che genera valori hash più lunghi? La famiglia SHA sembra una buona scelta. SHA-1 è un algoritmo di hashing che genera valori hash da 160 bit, e SHA-2 è una famiglia di algoritmi di hashing che genera valori hash da lunghezze di 224 bit, 256 bit, 384 bit, e 512 bit. Vediamo il valore hash SHA-256 di "123456":

Il valore hash SHA-256 è molto più lungo dell'MD5 e anche esso è irreversibile. Tuttavia, c'è un altro problema: se già conosci il valore hash, come quello sopra, e vedi l'esatto valore hash nel database, sai che la password è "123456". Un hacker può creare una lista di password comuni e i loro valori hash corrispondenti e confrontarli con i valori hash nel database. Questa lista è conosciuta come una tabella arcobaleno.

Salatura

Per mitigare gli attacchi a tavola arcobaleno, è stato introdotto il concetto di salatura. Il sale è una stringa casuale che viene aggiunta alla password prima dell'hashing. Ad esempio, se il sale è "salatura", e vuoi usare SHA-256 per hasare la password "123456" con il sale, invece di fare semplicemente:

Faresti:

Come puoi vedere, il risultato è completamente diverso dall'hashing senza sale. Tipicamente, durante la registrazione, ad ogni utente viene assegnato un sale casuale, che viene conservato nel database insieme al valore hash. Durante il processo di login, il sale viene utilizzato per calcolare il valore hash della password inserita, che viene poi confrontato con il valore hash memorizzato.

Iterazione

Nonostante l'aggiunta del sale, il valore hash è ancora suscettibile agli attacchi a forza bruta man mano che l'hardware diventa più potente. Per renderlo più difficile, può essere introdotta l'iterazione (cioè, eseguire l'algoritmo di hashing molte volte). Ad esempio, invece di usare:

Potresti usare:

Aumentare il numero di iterazioni rende più difficile la forza bruta. Tuttavia, questo influisce anche sul processo di login, in quanto diventa più lento. Pertanto, è necessario trovare un equilibrio tra sicurezza e prestazioni.

Intervallo della metà

Facciamo una pausa e riassumiamo le caratteristiche di un buon algoritmo di hashing della password:

  • Irreversibile (resistenza preimage)
  • Difficile da forzare
  • Resistente agli attacchi a tavola arcobaleno

Come potrai aver notato, il sale e l'iterazione sono necessari per soddisfare tutti questi requisiti. Il problema è che sia MD5 che la famiglia SHA non sono stati specificamente progettati per l'hashing delle password; sono ampiamente usati per i controlli di integrità (o "digest dei messaggi"). Di conseguenza, ogni sito web può avere la sua implementazione di sale e iterazione, rendendo difficile la standardizzazione e la migrazione.

Algoritmi di hashing delle password

Per affrontare questo problema, sono stati progettati diversi algoritmi di hashing specifici per l'hashing delle password. Diamo un'occhiata ad alcuni di loro.

bcrypt

bcrypt è un algoritmo di hashing delle password progettato da Niels Provos e David Mazières. È ampiamente utilizzato in molti linguaggi di programmazione. Ecco un esempio di valore hash bcrypt:

Anche se appare come un'altra stringa casuale, contiene informazioni aggiuntive. Scopriamolo:

  • La prima sezione $2y indica l'algoritmo, ovvero 2y.
  • La seconda sezione $12 indica il numero di iterazioni, ovvero 12. Questo significa che l'algoritmo di hashing sarà eseguito 212=4096 volte (iterazioni).
  • La terza sezione wNt7lt/xf8wRJgPU7kK2ju è il sale.
  • L'ultima sezione GrirhHK4gdb0NiCRdsSoAxqQoNbiluu è il valore hash.

bcrypt ha alcune limitazioni:

  • La lunghezza massima della password è di 72 byte.
  • Il sale è limitato a 16 byte.
  • Il valore hash è limitato a 184 bit.

Argon2

Dati i dibattiti e le limitazioni degli esistenti algoritmi di hashing delle password, nel 2015 si è tenuta una competizione per gli algoritmi di hashing delle password. Saltandoci i dettagli, concentriamoci sul vincitore: Argon2.

Argon2 è un algoritmo di hashing delle password progettato da Alex Biryukov, Daniel Dinu e Dmitry Khovratovich. Introduce diversi nuovi concetti:

  • Memoria-intensivo: L'algoritmo è progettato per essere difficile da parallelizzare, rendendo la forzatura con le GPU un impresa ardua.
  • Tempo-intensivo: L'algoritmo è progettato per essere difficile da ottimizzare, rendendo difficile la forzatura con gli ASIC (circuiti integrati specifici per l'applicazione).
  • Resistenza ai side-channel: L'algoritmo è progettato per resistere agli attacchi ai side-channel, come gli attacchi temporali.

Ci sono due versioni principali di Argon2, Argon2i e Argon2d. Argon2i è il più sicuro contro gli attacchi ai side-channel, mentre Argon2d offre la massima resistenza contro gli attacchi di cracking con GPU.

-- Argon2

Ecco un esempio di un valore hash Argon2:

Decifriamolo:

  • La prima sezione $argon2i indica l'algoritmo, che è argon2i.
  • La seconda sezione $v=19 indica la versione, che è 19.
  • La terza sezione $m=16,t=2,p=1 indica il costo della memoria, il costo del tempo e il grado di parallelismo, rispettivamente 16, 2, e 1.
  • La quarta sezione $YTZ5ZnpXRWN5SlpjMHBDRQ è il sale.
  • L'ultima sezione $12oUmJ6xV5bIadzZHkuLTg è il valore hash.

In Argon2, la lunghezza massima della password è 232-1 byte, il sale è limitato a 232-1 byte, e il valore hash è limitato a 232-1 byte. Questo dovrebbe bastare per la maggior parte degli scenari.

Argon2 è ora disponibile in molti linguaggi di programmazione, come node-argon2 per Node.js e argon2-cffi per Python.

Conclusione

Nel corso degli anni, gli algoritmi di hashing delle password hanno subito un'evoluzione significativa. Dobbiamo molto alla comunità della sicurezza per i loro decenni di sforzi nel rendere internet un posto più sicuro. Grazie ai loro contributi, gli sviluppatori possono dedicare maggiore attenzione alla creazione di servizi migliori senza preoccuparsi della sicurezza dell'hashing delle password. Anche se raggiungere una sicurezza al 100% in un sistema potrebbe essere irraggiungibile, possiamo impiegare diverse strategie per minimizzare i rischi associati.

Se preferisci evitare il disturbo di implementare l'autenticazione e l'autorizzazione, sentiti libero di provare Logto gratuitamente. Forniamo soluzioni sicure (usiamo Argon2!), affidabili e scalabili, che ti consentono di concentrarti sulla costruzione del tuo prodotto.