Gestione delle password

Per invertire l'hash di una password, un attaccante può utilizzare tabelle di hash precalcolate. Per esempio un attaccante si può creare una tabella di hash per le password più comuni o per tutte le possibili combinazioni di caratteri. Poi ogni volta che vuole invertire un hash, può cercare nella tabella il corrispondente hash e ottenere la password originale.

Ovviamente questo attacco costa tempo e risorse, in particolare lo spazio per memorizzare le tabelle di hash può essere molto grande. Tuttavia, esistono le tabelle di hash arcobaleno (rainbow tables) che permettono di ridurre lo spazio necessario per memorizzare i hash al costo di un aumento del tempo di ricerca nella tabella.

Per proteggere le password dagli attacchi con tabelle di hash, si può utilizzare il concetto di salt. Un salt è un valore casuale univoco che viene concatenato alla password prima di essere hashata. In questo modo, anche se due utenti hanno la stessa password, i loro hash saranno diversi a causa del salt diverso. Questo rende più difficile per un attaccante utilizzare tabelle di hash precalcolate, in quanto dovrebbe creare una tabella di hash per ogni possibile salt.

Per esempio, se un utente ha la password "password", il processo di hash sarebbe:

  • Generare un salt casuale di 6 caratteri, ad esempio "abcdef".
  • Generare l'hash della password concatenata al salt, \(hash = H(password+salt)\) dove la somma indica la concatenazione delle stringhe.
  • Memorizzare il salt e l'hash nel database.

Quando l'utente accede, il processo di verifica della password sarebbe:

  • Recuperare il salt e l'hash dal database relativo all'utente.
  • Concatenare la password inserita dall'utente al salt, \(hash2 = H(password + salt)\).
  • Verificare che \(hash2 == hash\).

In questo modo, se il database viene violato e gli hash e i salt vengono rubati, un attaccante non può utilizzare le tabelle di hash precalcolate per invertire gli hash, in quanto se un attaccante conosce l'hash di "password" con un determinato salt, non può utilizzarlo per trovare l'hash di "password"+salt. In particolare l'attaccante dovrebbe creare una tabella con tutte le password lunghe almeno 8+6=14 caratteri.