L'hash sul client ha senso solo se non ci si fida in qualche modo del server e non si vuole mostrare la password "effettiva" (quella che l'utente umano ricorda). Perché non vuoi mostrare la password proprio al sito in cui la suddetta password ha qualche utilità? Perché hai riutilizzato la password altrove! Di solito è male, ma esiste una versione relativamente sicura che si incarna in miriadi di estensioni del browser o bookmarklet come questo o quello (non garantisco la loro qualità). Si tratta di strumenti in cui l'utente umano ricorda una "password principale", da cui viene generata una password specifica del sito, utilizzando il nome di dominio del sito come una sorta di sale, in modo che due siti distinti ottengano password distinte.
Anche se questo scenario ha senso, farlo con Javascript inviato dal server stesso non lo fa. In effetti, lo scopo dell'hashing della password lato client è che il server è potenzialmente ostile (ad es. Sovvertito da un aggressore), e quindi il codice Javascript inviato da quel server è, come minimo, sospetto. Non vuoi inserire la tua preziosa password in qualche Javascript ostile ...
Un altro caso di hashing lato client riguarda l ' hashing lento . Poiché le password sono, per definizione, deboli, vuoi contrastare gli attacchi ai dizionari. Presumi che il malintenzionato abbia una copia del database del server e "proverà le password" sulle sue macchine (vedi questo post del blog per alcune discussioni su questo). Per rallentare l'avversario, utilizzi un processo di hashing intrinsecamente lento (come bcrypt), ma questo rallenterà l'elaborazione per tutti, incluso il server. Per aiutare il server, potresti voler scaricare parte del lavoro sul client, quindi eseguirne almeno una parte in un po 'di codice Javascript in esecuzione nel browser del client ...
Sfortunatamente, Javascript è terribilmente lento in questo tipo di lavoro (in genere da 20 a 100 volte più lento di un codice C decente) e il sistema client non sarà in grado di contribuire in parte sostanziale allo sforzo di hashing. L'idea è valida ma dovrà aspettare una tecnologia migliore (avrebbe funzionato con un client Java , però: con una JVM decente, il codice Java ottimizzato è da 2 a 4 volte più lento del codice C ottimizzato , per un lavoro di hashing).
Per riassumere, non ci sono davvero buoni motivi per eseguire l'hashing delle password lato client, dal codice Javascript inviato dal server stesso. È sufficiente inviare la password "così com'è" al server tramite un tunnel HTTPS (la pagina di accesso, l'URL di destinazione del modulo e qualsiasi pagina sia protetta dalla password devono essere tutte servite tramite SSL, altrimenti hanno problemi di sicurezza più urgenti rispetto all'uso delle password).