Давайте зробимо кілька приміток до попередніх відповідей.
По-перше, це, мабуть, не найкраща ідея використовувати хеш-алгоритми на стороні клієнта. Якщо ваш пароль посолений на стороні сервера, ви не зможете порівнювати хеші (принаймні ні, якщо ви не зберігаєте хеш-пам'ять клієнта в базі даних в одному з шарів хешування від пароля, який є однаковим або гірше). І ви не хочете реалізовувати алгоритм хешування, який використовується базою даних на стороні клієнта, це було б безглуздо.
По-друге, торгівля криптографічними ключами теж не є ідеальною. Теоретично MITM може (враховуючи, що на клієнті встановлений кореневий сертифікат) змінити криптографічні ключі та змінити за допомогою власних ключів:
Оригінальне з'єднання (не враховуючи tls) з теоретичного сервера, який обмінюється ключами:
Запит клієнта відкриті ключі> сервер містить приватні ключі, генерує відкриті ключі клієнту> сервер надсилає відкриті ключі клієнту
Тепер, у теоретичному нападі на MITM:
Запит клієнта на відкриті ключі> MITM генерує підроблені приватні ключі > Сервер утримує приватні ключі, генерує відкриті ключі для клієнта> MITM отримує відкриті ключі від оригінального сервера, тепер ми можемо відправити наші підроблені відкриті ключі клієнту, і кожного разу, коли запит надходить від клієнта, ми будемо розшифровувати дані клієнта за допомогою підроблених ключів, змінювати корисне навантаження (або читати його) та шифрувати оригінальними відкритими ключами > MITM надсилає підроблені відкриті ключі клієнту.
У цьому полягає сенс довіри сертифіката ЦС у TLS, і саме так ви отримуєте повідомлення від попередження браузера, якщо сертифікат недійсний.
У відповідь на ОП: на мою скромну думку, ви не можете цього зробити, тому що рано чи пізно хтось захоче напасти на користувача із вашої служби і спробує порушити ваш протокол.
Однак ви можете застосувати 2FA, щоб люди не намагалися ввійти з тим самим паролем. Однак пам’ятайте про повторні атаки.
Я не чудовий з криптографією, будь ласка, виправте мене, якщо я помиляюся.