Nếu máy chủ web của bạn cho phép hoặc bạn sẽ cần xử lý dữ liệu nhạy cảm, thì hãy sử dụng HTTPS. (Nó thường được yêu cầu bởi luật pháp afaik).
Ngược lại nếu bạn muốn thực hiện điều gì đó qua HTTP. Tôi sẽ làm một cái gì đó như thế này.
- Máy chủ nhúng khóa công khai của nó vào trang đăng nhập.
- Khách hàng điền biểu mẫu đăng nhập và bấm gửi.
- Một yêu cầu AJAX lấy dấu thời gian hiện tại từ máy chủ.
- Tập lệnh phía máy khách nối các thông tin xác thực, dấu thời gian và một muối (được băm từ dữ liệu tương tự, ví dụ: chuyển động chuột, sự kiện nhấn phím), mã hóa nó bằng khóa công khai.
- Gửi kết quả băm.
- Máy chủ giải mã hàm băm
- Kiểm tra xem dấu thời gian có đủ gần đây không (chỉ cho phép cửa sổ ngắn 5-10 giây). Từ chối đăng nhập nếu dấu thời gian quá cũ.
- Lưu trữ băm trong 20 giây. Từ chối cùng một băm để đăng nhập trong khoảng thời gian này.
- Xác thực người dùng.
Vì vậy, theo cách này, mật khẩu được bảo vệ và không thể phát lại cùng một băm xác thực.
Về tính bảo mật của mã thông báo phiên. Khó hơn một chút. Nhưng có thể khiến việc sử dụng lại mã thông báo phiên bị đánh cắp khó hơn một chút.
- Máy chủ đặt một cookie phiên bổ sung chứa một chuỗi ngẫu nhiên.
- Trình duyệt sẽ gửi lại cookie này vào yêu cầu tiếp theo.
- Máy chủ kiểm tra giá trị trong cookie, nếu nó khác thì nó sẽ hủy phiên, nếu không thì tất cả đều ổn.
- Máy chủ đặt lại cookie với văn bản khác.
Vì vậy, nếu mã thông báo phiên bị đánh cắp và một yêu cầu được gửi bởi người khác, thì theo yêu cầu tiếp theo của người dùng ban đầu, phiên sẽ bị hủy. Vì vậy, nếu người dùng tích cực duyệt trang web, nhấp vào các liên kết thường xuyên, thì kẻ trộm sẽ không đi xa với mã thông báo bị đánh cắp. Lược đồ này có thể được củng cố bằng cách yêu cầu một xác thực khác cho các hoạt động nhạy cảm (như xóa tài khoản).
CHỈNH SỬA: Xin lưu ý rằng điều này không ngăn chặn các cuộc tấn công MITM nếu kẻ tấn công thiết lập trang riêng của họ với khóa công khai khác và các yêu cầu proxy đến máy chủ. Để bảo vệ khỏi điều này, khóa công khai phải được ghim trong bộ nhớ cục bộ của trình duyệt hoặc trong ứng dụng để phát hiện các loại thủ thuật này.
Về cách triển khai: RSA có lẽ là thuật toán được biết đến nhiều nhất, nhưng nó khá chậm đối với các khóa dài. Tôi không biết việc triển khai PHP hoặc Javascript sẽ nhanh như thế nào. Nhưng có lẽ có một thuật toán nhanh hơn.