2012-06-14 36 views
6

Tôi có một dịch vụ web mà tôi cung cấp cho người dùng để gõ vào cơ sở dữ liệu ứng dụng của tôi và nhận một số thông tin. Người dùng phải đăng ký một khóa API và cung cấp khi thực hiện yêu cầu. Tất cả mọi thứ hoạt động tốt nhưng làm cách nào để kiểm tra xem người dùng đã đăng ký khóa có thực sự đưa ra yêu cầu và không phải ai đó mà anh ta có thể đã đưa ra chìa khóa không?Dịch vụ web REST và các khóa API

Tôi đã suy nghĩ trong hai ngày qua để tìm ra giải pháp nhưng không có gì cho đến nay.

+0

Bạn có sử dụng JAVA hoặc PHP (hoặc bất kỳ thứ gì khác) không? – sp00m

+0

ngôn ngữ phía máy chủ là PHP – slash197

+0

Khi @Laurent trả lời, bạn có thể xem xét quy trình OAuth, nhưng tôi sẽ đề xuất OAuth2. Ngay cả khi bài đăng là một chút cũ, bạn sẽ tìm thấy [ở đây] (http://stackoverflow.com/q/4875420/1225328) một thực hiện PHP của cơ chế đó. PS: Google và Facebook đều sử dụng OAuth2 để cho phép các nhà phát triển giao tiếp với API của họ. – sp00m

Trả lời

10

Bạn cần sử dụng các yêu cầu đã ký. Về cơ bản nó hoạt động như thế:

  • Bạn cung cấp cho người dùng của bạn một API key một "bí mật" (một chuỗi ngẫu nhiên) mà chỉ có bạn và khách hàng biết.
  • Bất cứ khi nào họ yêu cầu, họ thêm thông số "chữ ký" vào yêu cầu đó. Chữ ký này về cơ bản là một băm của các tham số yêu cầu + khóa API + các tham số khác (xem bên dưới) + bí mật.
  • Vì bạn cũng biết bí mật, bạn có thể xác minh rằng chữ ký là chính xác.

Để tránh các cuộc tấn công phát lại, bạn cũng có thể thêm nonces và dấu thời gian vào danh sách kết hợp. Một nonce chỉ đơn giản là một số mà phải được tăng lên bởi các khách hàng trên mỗi yêu cầu. Khi bạn nhận được yêu cầu, bạn kiểm tra xem bạn đã nhận được nonce/dấu thời gian này chưa. Nếu bạn đã làm, bạn từ chối yêu cầu (vì nó rất có thể là một cuộc tấn công phát lại). Nếu không, bạn lưu trữ nonce/timestamp trong cơ sở dữ liệu của bạn để bạn có thể tra cứu nó sau này.

Điều này ít nhiều yêu cầu được đăng nhập như thế nào trong OAuth. Hãy xem ví dụ của họ trong liên kết.

+0

Cảm ơn! Nghe có vẻ thú vị, tôi phải kiểm tra điều này. – slash197

+0

Nếu người dùng cung cấp khóa bí mật của họ, bạn không thể xác minh đúng danh tính của họ. Chính sách (và không phải công nghệ) phải quy định việc sử dụng thích hợp khóa API và khóa bí mật. Tuy nhiên, đây là thông tin tốt. Trong trường hợp nào một cuộc tấn công phát lại sẽ áp dụng - lưu lượng truy cập sniffing (khóa API/params) hoặc đoán các tham số yêu cầu? – KyleM

+0

@KyleM, có nó để ngăn chặn các cuộc tấn công MITM. Tôi đoán nó ít quan trọng hơn nếu kết nối vượt quá https (vì nó phải là). –

2

Có 2 phần để xác thực cuộc gọi REST API. Khi người dùng đăng ký dịch vụ của bạn, thông thường bạn sẽ chỉ định một KEY xác định người dùng đó. Đôi khi, điều này là đủ. Nhưng KEY này có thể được chia sẻ, hoặc bị đánh cắp. Trong trường hợp đó, dịch vụ của bạn sẽ vẫn coi KEY là hợp lệ. Bây giờ, để ngăn chặn các vụ tấn công quan trọng, vv, bạn cũng sẽ phân phối khóa bí mật. Khóa này không bao giờ được chuyển với yêu cầu REST API. Phím này được sử dụng để thực hiện băm một chiều của yêu cầu API và tạo chữ ký (HMAC).

Chữ ký này, cộng với yêu cầu API (yêu cầu HTTP dưới dạng URL) sau đó được gửi đến Máy chủ API. Máy chủ thực hiện băm một chiều của URL và so sánh với chữ ký bằng cách sử dụng khóa riêng của người dùng này. Nếu chúng khớp nhau, nó được "giả định" mà người yêu cầu có quyền truy cập vào khóa riêng, và do đó yêu cầu là hợp lệ.

Để tránh các cuộc tấn công phát lại, ngoài nonce (như đề xuất của poster trước), bạn cũng có thể sử dụng chuỗi băm.

Các vấn đề liên quan