Prenons quelques notes sur les réponses précédentes.
Premièrement, ce n'est probablement pas la meilleure idée d'utiliser des algorithmes de hachage côté client. Si votre mot de passe est salé côté serveur, vous ne pourrez pas comparer les hachages (du moins pas si vous ne stockez pas le hachage client dans la base de données dans l'une des couches de hachage du mot de passe, qui est le même ou pire). Et vous ne voulez pas implémenter l'algorithme de hachage utilisé par la base de données côté client, ce serait idiot.
Deuxièmement, échanger des clés cryptographiques n'est pas non plus idéal. Le MITM pourrait théoriquement (étant donné qu'il a un certificat racine installé sur le client) changer les clés cryptographiques, et changer avec ses propres clés:
Connexion d'origine (sans tenir compte de tls) depuis un serveur théorique qui échange des clés:
Le client demande des clés publiques> le serveur détient les clés privées, génère des clés publiques au client> le serveur envoie des clés publiques au client
Maintenant, dans une piste théorique MITM:
Le client demande des clés publiques> MITM génère de fausses clés privées > Le serveur détient les clés privées, génère des clés publiques au client> MITM reçoit les clés publiques du serveur d'origine, maintenant, nous sommes libres d'envoyer nos fausses clés publiques au client, et chaque fois qu'une demande provient du client, nous déchiffrerons les données du client avec les fausses clés, changerons la charge utile (ou la lirons) et chiffrerons avec les clés publiques d'origine > MITM envoie de fausses clés publiques au client.
C'est le point d'avoir un certificat CA de confiance dans TLS, et c'est ainsi que vous recevez un message d'avertissement du navigateur si le certificat n'est pas valide.
En réponse à l'OP: à mon humble avis, vous ne pouvez pas faire cela, car tôt ou tard, quelqu'un voudra attaquer un utilisateur de votre service et tentera de briser votre protocole.
Ce que vous pouvez faire, cependant, est d'implémenter 2FA pour empêcher les gens d'essayer de se connecter avec le même mot de passe. Attention cependant aux attaques par rejeu.
Je ne suis pas doué pour la cryptographie, veuillez me corriger si je me trompe.