Như những người khác đã đề cập, không còn nguy hiểm hơn việc gửi một bài đăng HTTP từ một biểu mẫu. Trong thực tế, đó là điều rất giống nhau.
Nhưng nếu HTTPS không phải là tùy chọn, bạn luôn có thể sử dụng lược đồ thách thức/phản hồi qua kết nối không được mã hóa. Về cơ bản, nó hoạt động như sau:
- Máy chủ có một SHA (hoặc bất kỳ thuật toán băm nào bạn thích) băm mật khẩu của người dùng.
- Khách hàng có mật khẩu.
- yêu cầu khách hàng (sử dụng mã hóa AJAX) mà máy chủ gửi một thách thức (một chuỗi ngẫu nhiên của byte; nhân vật cũng tốt.)
- Server tạo ra một thách thức và là một thách thức ID, và lưu nó với thời hạn.
- Khách hàng sẽ nhận được ID thách thức và thách thức.
- Khách hàng băm mật khẩu bằng SHA.
- Khách hàng băm băm kết quả với thử thách được thêm vào theo một cách nào đó.
- Khách hàng gửi ID thử thách (không phải là bản thân thử thách) và mã băm kết quả thứ hai.
- Máy chủ tra cứu thử thách bằng ID nếu nó tồn tại và chưa hết hạn.
- Máy chủ gắn thêm thách thức vào băm mật khẩu được lưu trữ và tạo một băm bằng cách sử dụng cùng một lược đồ như ứng dụng khách.
- Máy chủ so sánh giá trị băm của nó với ứng dụng khách.Nếu nó giống nhau, người dùng được xác thực.
Nó thực sự khá đơn giản để thiết lập khi bạn có ý tưởng. Wikipedia có một số thông tin bổ sung về nó.
EDIT: Tôi nhận thấy rằng tôi đã quên đề cập đến việc xác thực có thành công hay không. Việc cung cấp cho khách hàng nhiều nỗ lực trên một thử thách có thể dẫn đến các vấn đề về bảo mật.
Nguồn
2009-07-17 19:22:15
Cách tốt nhất để đảm bảo điều này là gì, ngoài việc sử dụng SSL? Nếu có thể băm mật khẩu trong JavaScript thì đây có phải là giải pháp có thể thay đổi được không? – j82374823749
Nếu bạn băm mật khẩu trong JavaScript, nó vẫn sẽ được hiển thị cho bất cứ ai đánh hơi lưu lượng truy cập (nó sẽ chỉ được băm!) Một kẻ tấn công có thể chơi lại yêu cầu này với mật khẩu băm trong nó –
Và SSL sẽ giải quyết vấn đề này? – j82374823749