Machen wir uns einige Notizen zu früheren Antworten.
Erstens ist es wahrscheinlich nicht die beste Idee, Hash-Algorithmen clientseitig zu verwenden. Wenn Ihr Kennwort auf der Serverseite gesalzen ist, können Sie keine Hashes vergleichen (zumindest nicht, wenn Sie den Client-Hash nicht in der Datenbank in einer der Hash-Ebenen des Kennworts speichern, die identisch sind oder schlechter). Und Sie möchten den von der Datenbank auf der Clientseite verwendeten Hashing-Algorithmus nicht implementieren, es wäre dumm.
Zweitens ist es auch nicht ideal, kryptografische Schlüssel auszutauschen. Das MITM könnte theoretisch (wenn man bedenkt, dass auf dem Client ein Stammzertifikat installiert ist) die kryptografischen Schlüssel ändern und mit seinen eigenen Schlüsseln ändern:
Ursprüngliche Verbindung (ohne Berücksichtigung von tls) von einem theoretischen Server, der Schlüssel austauscht:
Öffentliche Schlüssel für Clientanforderung> Server enthält die privaten Schlüssel, generiert öffentliche Schlüssel für Client> Server sendet öffentliche Schlüssel an Client
Nun, in einem theoretischen MITM-Atrack:
Öffentliche Schlüssel für Clientanfragen > MITM generiert gefälschte private Schlüssel > Server hält die privaten Schlüssel, generiert öffentliche Schlüssel für den Client> MITM empfängt die öffentlichen Schlüssel vom ursprünglichen Server. Jetzt können wir unsere gefälschten öffentlichen Schlüssel an den Client senden Wenn eine Anfrage vom Client kommt, entschlüsseln wir die Clientdaten mit den gefälschten Schlüsseln, ändern die Nutzdaten (oder lesen sie) und verschlüsseln sie mit den ursprünglichen öffentlichen Schlüsseln. > MITM sendet gefälschte öffentliche Schlüssel an den Client.
Dies ist der Grund dafür, dass Sie ein vertrauenswürdiges CA-Zertifikat in TLS haben. Auf diese Weise erhalten Sie eine Warnung vom Browser, wenn das Zertifikat nicht gültig ist.
Als Antwort auf das OP: Meiner bescheidenen Meinung nach können Sie das nicht tun, weil früher oder später jemand einen Benutzer von Ihrem Dienst aus angreifen möchte und versucht, Ihr Protokoll zu brechen.
Sie können jedoch 2FA implementieren, um zu verhindern, dass Benutzer jemals versuchen, sich mit demselben Kennwort anzumelden. Vorsicht vor Wiederholungsangriffen.
Ich bin nicht besonders gut mit Kryptografie. Bitte korrigieren Sie mich, wenn ich falsch liege.