Tôi đang triển khai dịch vụ web REST bằng C# sẽ được lưu trữ trên Azure dưới dạng dịch vụ đám mây. Vì nó là một dịch vụ REST, nó là không trạng thái và do đó không có cookie hoặc trạng thái phiên.Thực hiện mã thông báo xác thực dịch vụ web REST
Dịch vụ web chỉ có thể được truy cập qua HTTPS (Chứng chỉ do StartSSL.com cung cấp).
Khi người dùng đăng nhập thành công vào dịch vụ, họ sẽ nhận được mã thông báo bảo mật. Mã thông báo này sẽ cung cấp xác thực trong các liên lạc trong tương lai.
Mã thông báo sẽ chứa dấu thời gian, địa chỉ người dùng và địa chỉ IP của ứng dụng khách.
Mọi giao tiếp sẽ chỉ xảy ra qua HTTPS vì vậy tôi không quan tâm đến mã thông báo bị chặn và sử dụng trong các cuộc tấn công phát lại; mã thông báo sẽ hết hạn.
Vì đây là dịch vụ đối mặt công khai, tuy nhiên tôi lo ngại rằng ai đó có thể đăng ký dịch vụ, đăng nhập và sau đó sửa đổi mã thông báo mà họ nhận được để truy cập vào tài khoản của người dùng khác.
Tôi tự hỏi làm thế nào tốt nhất để bảo mật nội dung của mã thông báo và cũng xác minh rằng nó không bị giả mạo.
tôi có kế hoạch làm những điều sau đây để bảo đảm mã thông báo:
Các khách hàng thành công đăng nhập vào các dịch vụ và các dịch vụ thực hiện:
- Tạo một giá trị ngẫu nhiên và băm nó với SHA256 1000 lần.
- Tạo khóa phiên một lần từ khóa cá nhân + giá trị ngẫu nhiên được băm.
- Băm khóa phiên với SHA256 1000 lần và sau đó sử dụng khóa này để mã hóa mã thông báo
- Sử dụng khóa riêng để ký mã thông báo được mã hóa bằng RSA.
- Gửi mã thông báo được mã hóa + chữ ký + giá trị ngẫu nhiên được băm cho khách hàng trong gói JSON không được mã hóa.
Khi khách hàng gọi dịch vụ, nó sẽ gửi mã thông báo mã hóa và chữ ký trong gói JSON không được mã hóa đến dịch vụ. Dịch vụ này sẽ
- Tạo lại khóa phiên từ khóa riêng + giá trị ngẫu nhiên băm
- Sử dụng khóa riêng để xác minh chữ ký
- Sử dụng phím phiên băm để giải mã token
- Kiểm tra xem mã thông báo chưa hết hạn
- Tiếp tục với thao tác được yêu cầu ...
Tôi thực sự không biết gì về mã hóa vì vậy tôi có một số câu hỏi:
- Điều này có đủ hay quá mức không?
- Tôi đọc điều đó để phát hiện giả mạo tôi nên bao gồm HMAC với mã thông báo. Vì tôi ký hợp đồng với khóa riêng, tôi có cần HMAC không?
- Tôi có nên sử dụng Rijndael thay vì RSA không?
- Nếu Rijndael được ưu tiên, IV có được yêu cầu để giải mã không? tức là tôi có thể vứt nó đi hoặc tôi có cần gửi mã thông báo được mã hóa không? ví dụ. Mã hóa được mã hóa + HMAC + IV + giá trị ngẫu nhiên được băm.
Vì mọi giao tiếp diễn ra qua HTTPS gói JSON không mã hóa không thực sự không được mã hóa cho đến khi nó đến được máy khách.
Ngoài ra, tôi có thể muốn triển khai lại dịch vụ trong PHP sau này để tất cả điều này cũng cần phải thực hiện được trong PHP.
Cảm ơn sự giúp đỡ của bạn
Cảm ơn vì điều đó. Tôi đã quyết định sử dụng Rijndael và HMAC nhưng vẫn cố gắng để có được đầu của tôi xung quanh nó. Tôi có thể sử dụng IV để lấy khóa phiên từ khóa chính không? Tôi cũng có thể sử dụng khóa phiên tương tự cho HMAC hoặc tôi có cần lấy một khóa mới từ khóa phiên hiện tại không? Nếu tôi cần một khóa mới cho HMAC tôi có thể sử dụng IV hiện tại cho điều này hay tôi cần một giá trị ngẫu nhiên mới không? Cuối cùng bạn đã đề cập rằng tôi không nên mã hóa dấu thời gian với ID người dùng, làm thế nào tôi có thể biết rằng mã thông báo đã hết hạn? vì tôi không thể lưu trữ một bản ghi phiên trong cơ sở dữ liệu. Cảm ơn một lần nữa. –
Câu hỏi hay. Tôi sẽ cập nhật câu trả lời với một số thông tin bổ sung –
Ok tôi nhận được tất cả những điều đó. Vì vậy, HMAC được tính toán từ dữ liệu không được mã hóa và sau đó được mã hóa với dữ liệu? Tôi có cần lưu trữ HMAC trên máy chủ để so sánh sau hoặc tôi có thể mã hóa mã thông báo và sau đó tính toán HMAC từ dữ liệu chưa được mã hóa và so sánh nó với HMAC đã được mã hóa với dữ liệu không? –