Hãy thực hiện một số ghi chú cho các câu trả lời trước.
Đầu tiên, có lẽ không phải là ý tưởng tốt nhất khi sử dụng thuật toán băm phía máy khách. Nếu mật khẩu của bạn bị nhiễm mặn ở phía máy chủ, bạn sẽ không thể so sánh các hàm băm (ít nhất là không nếu bạn không lưu trữ hàm băm của ứng dụng khách trong cơ sở dữ liệu ở một trong các lớp băm từ mật khẩu, giống hoặc tệ hơn). Và bạn không muốn triển khai thuật toán băm được sử dụng bởi cơ sở dữ liệu ở phía máy khách, điều đó sẽ thật ngớ ngẩn.
Thứ hai, giao dịch các khóa mật mã cũng không phải là lý tưởng. Về mặt lý thuyết, MITM có thể (coi như anh ta đã cài đặt chứng chỉ gốc trên máy khách) thay đổi các khóa mật mã và thay đổi bằng các khóa của chính mình:
Kết nối ban đầu (không tính đến tls) từ một máy chủ lý thuyết trao đổi khóa:
Ứng dụng khách yêu cầu khóa công khai> máy chủ giữ khóa cá nhân, tạo khóa công khai cho máy khách> máy chủ gửi khóa công khai cho máy khách
Bây giờ, trong trạng thái MITM lý thuyết:
Ứng dụng khách yêu cầu khóa công khai> MITM tạo khóa cá nhân giả mạo > Máy chủ giữ khóa cá nhân, tạo khóa công khai cho ứng dụng khách> MITM nhận khóa công khai từ máy chủ ban đầu, hiện tại, chúng tôi có thể tự do gửi khóa công khai giả của mình cho khách hàng và bất cứ khi nào có yêu cầu từ khách hàng, chúng tôi sẽ giải mã dữ liệu khách hàng bằng các khóa giả, thay đổi tải trọng (hoặc đọc nó) và mã hóa bằng các khóa công khai gốc > MITM gửi các khóa công khai giả cho khách hàng.
Đó là điểm của việc có chứng chỉ CA đáng tin cậy trong TLS và đó là cách bạn nhận được thông báo từ cảnh báo của trình duyệt nếu chứng chỉ không hợp lệ.
Trả lời OP: theo ý kiến khiêm tốn của tôi, bạn không thể làm điều đó, bởi vì sớm hay muộn, ai đó sẽ muốn tấn công người dùng từ dịch vụ của bạn và sẽ cố gắng phá vỡ giao thức của bạn.
Tuy nhiên, những gì bạn có thể làm là triển khai 2FA để ngăn mọi người cố gắng đăng nhập bằng cùng một mật khẩu. Mặc dù vậy, dấu hiệu của các cuộc tấn công phát lại.
Tôi không giỏi về mật mã, vui lòng sửa cho tôi nếu tôi sai.