Le hachage sur le client n'a de sens que si vous ne faites pas confiance au serveur d'une manière ou d'une autre, et ne voulez pas lui montrer le mot de passe "réel" (celui dont l'utilisateur se souvient). Pourquoi ne voudriez-vous pas montrer le mot de passe au site même sur lequel ledit mot de passe a une quelconque utilité? Parce que vous avez réutilisé le mot de passe ailleurs! Maintenant, c'est généralement mauvais, mais il existe une version relativement sûre qui est incarnée dans une myriade d'extensions de navigateur ou de signets tels que celui-ci ou celui-là (je ne garantis pas leur qualité). Ce sont des outils où l'utilisateur humain se souvient d'un "mot de passe principal", à partir duquel un mot de passe spécifique au site est généré, en utilisant le nom de domaine du site comme une sorte de sel, de sorte que deux sites distincts obtiennent des mots de passe distincts.
Bien que ce scénario ait du sens, le faire avec Javascript envoyé par le serveur lui-même ne l'est pas. En effet, le point de hachage du mot de passe côté client est que le serveur est potentiellement hostile (par exemple subverti par un attaquant), et donc le code Javascript envoyé par ce serveur est, à tout le moins, suspect. Vous ne voulez pas entrer votre précieux mot de passe dans un Javascript hostile ...
Un autre cas de hachage côté client concerne le hachage lent . Les mots de passe étant, par définition, faibles, vous souhaitez contrecarrer les attaques par dictionnaire. Vous supposez que le méchant a obtenu une copie de la base de données du serveur et qu'il "essaiera des mots de passe" sur ses propres machines (voir ce billet de blog pour une discussion à ce sujet). Pour ralentir l'adversaire, vous utilisez un processus de hachage intrinsèquement lent (tel que bcrypt), mais cela ralentira le traitement pour tout le monde, y compris le serveur. Pour aider le serveur, vous voudrez peut-être décharger une partie du travail sur le client, donc faites-en au moins une partie dans du code Javascript exécuté dans le navigateur client ...
Malheureusement, Javascript est terriblement lent pour ce genre de travail (généralement 20 à 100 fois plus lent que le code C décent), et le système client ne pourra pas contribuer pour une part substantielle à l'effort de hachage. L'idée est bonne mais devra attendre une meilleure technologie (cela aurait cependant fonctionné avec un client Java : avec une JVM décente, le code Java optimisé est environ 2 à 4 fois plus lent que le code C optimisé , pour un travail de hachage).
Pour résumer, il n'y a pas vraiment de bonnes raisons de faire un hachage de mot de passe côté client, à partir du code Javascript envoyé par le serveur lui-même. Envoyez simplement le mot de passe "tel quel" au serveur via un tunnel HTTPS (la page de connexion, l'URL de destination du formulaire et toute page protégée par le mot de passe doivent tous être servis via SSL, sinon vous ont des problèmes de sécurité plus urgents que l'utilisation de mots de passe).