L'hashing sul server e l'hashing sul client attenuano diversi attacchi, quindi è necessario considerare quali attacchi è necessario proteggere.
Hash lato server
L'hashing sul server mitiga il compromesso delle password memorizzate (ad esempio la perdita del database). Se le password non sono associate qui, un utente malintenzionato avrà accesso immediato alle credenziali, consentendo in tal modo l'accesso al server. Memorizzando le password con hash, l'utente malintenzionato è costretto a dedicare ulteriore impegno al recupero delle credenziali effettive.
Hash lato client
L'hashing sul client mitiga gli attacchi sul canale tra il client e il server, nonché sui componenti del server che elaborano le credenziali non elaborate (componente di accesso, password impostata e componente di modifica). Mediante hashing della password sul client, l'utente malintenzionato è costretto a dedicare uno sforzo ulteriore al fine di recuperare la password effettiva. Si noti tuttavia che questo hash è un equivalente in testo normale - se un utente malintenzionato cattura l'hash, può usarlo per autenticare il server.
Il valore qui è nella protezione della password che l'utente ha inserito, dal momento che la maggior parte degli utenti usa la stessa password per altri servizi. Mentre catturare l'equivalente in testo normale comprometterebbe l'account dell'utente sul servizio, non comprometterebbe gli account dell'utente su altri servizi. Ovviamente se tutti i servizi usassero questo schema lo stesso hash sarebbe un equivalente in testo normale per altri siti, e quindi dovrebbe essere aggiunto qui un sale unico per il proprio servizio.
Quindi cosa si dovrebbe fare?
La prima classe di attacchi deve assolutamente essere protetta, dal momento che si verificano perdite di database, e quindi l'hashing lato server è un must. La seconda classe di attacchi è in gran parte mitigata dall'uso di TLS e quindi lo sforzo extra di utilizzare l'hashing del lato client di solito non ne vale la pena.
Gli hash
Come altri hanno già detto, l'uso di MD5 e SHA1 è strongmente scoraggiato. La famiglia di hash SHA2 è di per sé sicura, ma non solo appropriata per l'hashing della password perché sono progettati per essere veloci. Le password devono essere sottoposte a hash con uno schema appositamente progettato per l'hashing delle password, ad esempio bcrypt , scrypt o PBKDF2 . Se uno di questi schemi non è davvero un'opzione, la password deve essere salata e iterativamente con hash con un hash SHA2.
Altri approcci
Esistono schemi come SRP che non memorizzano la password o l'equivalente in testo normale sul server, né trasmettono la password o l'equivalente in testo normale tra client e server.