di hashing
Una funzione di hashing utilizza un algoritmo creato pensando a diverse cose:
- Qualsiasi hash generato avrà la stessa lunghezza (cioè un hash SHA256 lo farà
sempre 256 bit)
- Usare sempre lo stesso algoritmo di hashing con lo stesso input
lo stesso output
- Un piccolo cambiamento nel valore originale da hash avrà un enorme
impatto sul valore dell'hash
- Non è possibile direttamente invertire un hash
Memorizzando solo la versione hash di una password, non è possibile direttamente trovare la password che lo accompagna. In questo modo, quando il database con i dati dell'utente viene rubato, i criminali avranno solo hash, ma non le password effettive.
Quando una password viene immessa sul client, viene inviata tramite una connessione sicura (ad esempio HTTPS). Il server esegue quindi la funzione di hash e la confronta con l'hash della password memorizzata. (Se l'hash viene eseguito sul client è facile rinviare l'hash.)
Se corrispondono, si presume che sia stata inserita la password corretta (in teoria una password diversa potrebbe avere lo stesso hash, ma è improbabile che ciò accada).
Quale funzione di hashing usare è un compromesso tra sicurezza e usabilità.
La quantità di tempo necessaria per calcolare un hash è importante: vuoi una funzione di hashing che non può essere risolta rapidamente, perché allora un attacco di forza bruta diventa fattibile, d'altra parte non vuoi che i tuoi utenti dover aspettare un minuto mentre il server sta controllando la propria password.
Tabelle arcobaleno
Perché dico che non possono essere direttamente invertiti perché è possibile creare un dizionario che ha tutte le password possibili e i valori hash che appartengono a quelle password ("numerari di curve "). Una tabella arcobaleno è specifica per un particolare algoritmo di hashing (MD5, SHA-1, SHA-2, ecc.)
Esistono vari siti online con tabelle arcobaleno, ad esempio MD5cracker.org per hash MD5 o crackstation.net per varie funzioni di hash.
Salt
Una possibile protezione contro le tabelle arcobaleno è l'uso di sali . L'idea è di aggiungere un numero di byte aggiuntivi alla password per renderla più lunga (questo non influenza però la lunghezza dell'hash, poiché rimane della stessa lunghezza, indipendentemente da ciò che viene sottoposto a hash).
Un sale viene generalmente aggiunto come segue ( +
è concatinazione):
saltedhash(password) = hash(password + salt)
o
saltedhash(password) = hash(hash(password) + salt)
I sali non devono essere tenuti segreti, quindi possono essere memorizzati nel database con la password. Per impedire che le stesse password appaiano come lo stesso hash nel database, usa un sale separato, casuale per ogni password.