Mari kita buat beberapa catatan untuk jawaban sebelumnya.
Pertama, itu mungkin bukan ide terbaik untuk menggunakan sisi klien algoritma hash. Jika kata sandi Anda diasinkan di sisi server, Anda tidak akan dapat membandingkan hash (setidaknya tidak jika Anda tidak menyimpan hash klien dalam database di salah satu lapisan hashing dari kata sandi, yang sama atau lebih buruk). Dan Anda tidak ingin mengimplementasikan algoritma hashing yang digunakan oleh database di sisi klien, itu akan konyol.
Kedua, menukar kunci kriptografi juga tidak ideal. MITM secara teoritis (mengingat dia memiliki sertifikat root yang diinstal pada klien) mengubah kunci kriptografi, dan mengubah dengan kuncinya sendiri:
Koneksi asli (tidak mempertimbangkan tls) dari server teoritis yang bertukar kunci:
Klien meminta kunci publik> server memegang kunci privat, menghasilkan kunci publik ke klien> server mengirimkan kunci publik ke klien
Sekarang, di jalur MITM teoretis:
Klien meminta kunci publik> MITM menghasilkan kunci privat palsu > Server menyimpan kunci privat, menghasilkan kunci publik ke klien> MITM menerima kunci publik dari server asli, sekarang, kami bebas untuk mengirim kunci publik palsu kami ke klien, dan setiap kali permintaan datang dari klien, kami akan mendekripsi data klien dengan kunci palsu, mengubah muatan (atau membacanya) dan mengenkripsi dengan kunci publik asli > MITM mengirimkan kunci publik palsu ke klien.
Itulah tujuan memiliki sertifikat CA tepercaya di TLS, dan begitulah cara Anda menerima pesan dari peringatan browser jika sertifikat tersebut tidak valid.
Menanggapi OP: menurut pendapat saya Anda tidak dapat melakukan itu, karena cepat atau lambat, seseorang akan ingin menyerang pengguna dari layanan Anda dan akan mencoba untuk melanggar protokol Anda.
Apa yang dapat Anda lakukan, bagaimanapun, adalah menerapkan 2FA untuk mencegah orang mencoba masuk dengan kata sandi yang sama. Waspadai serangan replay.
Saya tidak ahli dalam kriptografi, mohon koreksi jika saya salah.