Tôi đang xây dựng API cho dịch vụ REST mà tôi sẽ sản xuất và tiêu thụ. Tôi đã dành vài ngày qua để cố gắng tìm ra cách xử lý xác thực độc đáo và nghĩ rằng cuối cùng tôi đã nghĩ ra một cái gì đó.
Tôi sẽ đưa ra điều này dựa trên các sự kiện sau đây về ngăn xếp ứng dụng:
- Client & Server nằm trong .NET4 (Phần máy khách trong Hồ sơ khách hàng)
- Máy chủ hiển thị bằng WCF REST
- Tôi thực sự không muốn giữ tên người dùng và mật khẩu trong bộ nhớ trong ứng dụng
Từ 3, tôi muốn sử dụng một hình thức xác thực mã thông báo, để sau khi thông tin được xác thực bởi máy chủ, khách hàng sẽ nhận lại mã thông báo để sử dụng trong suốt phần còn lại của ứng dụng (điều này sẽ cho phép tôi làm những việc khác, chẳng hạn như hết thời gian người dùng, có thể di chuyển người dùng liền mạch giữa các phiên bản web và máy tính để bàn, v.v.). Sau khi tìm ra cách thực hiện các cuộc gọi phát lại và chống giả mạo, tôi đã đưa ra các cách sau:
- Trước khi máy khách cố gắng xác thực, nó sẽ tạo một cặp khóa Diffie-Hellman bằng cách sử dụng
ECDiffieHellmanCng
lớp. - Nó sẽ gửi phần công khai của cặp khóa qua dây cùng với tên người dùng và mật khẩu (tất nhiên là qua HTTPS).
- Máy chủ xác thực kết hợp tên người dùng / mật khẩu, nếu thành công, thì nó sẽ thực hiện như sau:
- Tạo mã thông báo phiên duy nhất
- Tạo cặp khóa DH riêng và tính toán bí mật chung từ khóa chung do khách hàng cung cấp
- Ghi chú mã thông báo phiên, bí mật được chia sẻ, người dùng và thời gian "hành động cuối cùng" (được sử dụng cho cửa sổ hết hạn cuộn) trong cơ sở dữ liệu của nó
- Trả về mã thông báo phiên, khóa DH công khai của nó và thông báo thành công xác thực
- Khách hàng lấy khóa DH từ phản hồi, tính toán bí mật được chia sẻ và lưu trữ cả mã thông báo và bí mật trong bộ nhớ.
Từ thời điểm này, tổ hợp mã thông báo / bí mật phiên hoạt động giống như hầu hết các API REST khác, với yêu cầu được lấy dấu vân tay và dấu thời gian, và sau đó có một số loại HMAC được tạo. Bất cứ khi nào khách hàng thực hiện một hành động chống lại máy chủ, nó sẽ kiểm tra cặp mã thông báo / bí mật và cho phép hành động nếu nó hợp lệ và không hết hạn và cập nhật bản ghi hành động cuối cùng trong phiên.
Tôi không thấy bất kỳ sai sót rõ ràng nào, và có lẽ được thiết kế quá mức cho việc này, nhưng tôi cần học cách làm điều này vào một lúc nào đó. HMAC ngăn chặn các cuộc tấn công phát lại, đàm phán DH giúp ngăn chặn các cuộc tấn công MITM (Tôi không thể nghĩ về một cuộc tấn công khả thi ngoài đỉnh đầu giữa HMAC / DH).
Bất kỳ lỗ ai cũng có thể chọc vào này?