Penso che dipenda da cosa fa il server, ma non aggiunge molta protezione in entrambi i casi (o è anche peggio). (Inoltre, l'utente medio sa come calcolare un hash sul cellulare? Mi sembra una seccatura.)
1. Il server memorizza la password con hash
Ciò significa che il client invia H = hash(password)
al server, il server cerca i client hash password H'
nel DB e convalida il client controllando H == H'
. Questo è veramente brutto. Ora, se si verifica una violazione del DB, l'utente malintenzionato può inserire la password hash archiviata nel DB per accedere. Rimuove essenzialmente il punto di hashing in primo luogo ed è come se la password in chiaro fosse archiviata.
2. Il server memorizza l'hash della password con hash
Questo significa che il client invia H = hash(password)
al server, il server cerca l'hash dei client hashed password H'
nel DB e convalida il client controllando H' == hash(H)
. Ora se si verifica una violazione del DB, l'attaccante deve controllare se hash(hash(guess)) == recovered_hash
, quindi il costo per l'attaccante è di circa 2 volte quello che sarebbe senza hashing sul lato client (cioè l'attaccante può controllare le password più lentamente del 50% che non è molto una vittoria). La sicurezza in questo caso dipende ancora da hash
che è una funzione (non invertibile) resistente agli attacchi di dizionario, l'hashing del lato client non aiuta molto.
Riassumendo, la cosa migliore da fare è che il client inserisca la password in chiaro, trasmetta la password al server tramite HTTPS e hash la password sul server con qualcosa come bcrypt o scrypt, memorizzando solo l'hash sul server. Il motivo per cui la tua costruzione non è un miglioramento è che il "seme" se non ottieni alcuna entropia ed è altrettanto facile (o non facile) da indovinare, stai solo aggiungendo uno stadio intermedio.