it-swarm-vi.com

Cách triển khai API-Key-Cơ chế

trước hết: Tôi khá không chắc chắn về tiêu đề của câu hỏi, vì vậy nếu bạn có ý tưởng tốt hơn, xin vui lòng cho biết (:

Tôi muốn biết về các ví dụ thực tiễn tốt nhất trong đó các dịch vụ (như Twitter hoặc đồng) cung cấp API và muốn bạn là nhà phát triển sử dụng một số API-Key ngăn các bên thứ ba lấy khóa đó.

Tôi sẽ giải thích liên quan của tôi với các ví dụ xấu:

Theo tôi biết, Twitter và FB yêu cầu bạn sử dụng Khóa API cho các yêu cầu API. Điều đó tốt cho các ứng dụng phía máy chủ, nhưng ngay khi bạn gửi khóa của mình từ ứng dụng web hoặc ứng dụng trên máy tính để bàn, khóa sẽ hiển thị cho người khác.

Vì bạn phải gửi khóa đó, nên việc lưu trữ nó bên trong ứng dụng của bạn sẽ không có ý nghĩa gì. Đối với yêu cầu, nó phải đơn giản.

Một điều bạn có thể làm là Lưu trữ dịch vụ web hoặc trình bao bọc của riêng bạn nối thêm phía máy chủ chính và sau đó định tuyến yêu cầu đến máy chủ đích.

Nhưng điều này là không thể nếu Twitter/hoặc bất kỳ dịch vụ nào bạn đang sử dụng đang giới hạn các yêu cầu API trên mỗi IP hoặc muốn tạo thống kê dựa trên IP.

Vì vậy, để tóm tắt: Nếu tôi ở vị trí tạo API cho người khác và không muốn họ sử dụng SSL, tôi có thể đảm bảo khóa của họ an toàn và không dễ bị đánh cắp ?

34
user510083

Thực hành tốt nhất là:

Ý tưởng cơ bản. Tạo khóa API (khóa đối xứng 128 bit) cho mỗi tài khoản người dùng riêng biệt. Khóa này cần được lưu trữ an toàn trên máy chủ và cũng được lưu trữ an toàn trên máy khách của người dùng.

Đối với mỗi yêu cầu được thực hiện bởi khách hàng, hãy thêm một tham số yêu cầu bổ sung có "chữ ký" trên toàn bộ yêu cầu. "Chữ ký" phải được tính là S = MAC ( [~ # ~] k [~ # ~], [~ # ~] r [~ # ~]), trong đó [~ # ~] k [~ # ~] là khóa API và [~ # ~] r [~ # ~] = là toàn bộ yêu cầu, bao gồm tất cả các tham số yêu cầu. Ở đây MAC phải là một thuật toán mã xác thực tin nhắn an toàn, chẳng hạn như AES-CMAC hoặc SHA1-HMAC.

Trách nhiệm của khách hàng là tính toán chữ ký và nối nó với yêu cầu; trách nhiệm của máy chủ là xác minh chữ ký và bỏ qua mọi yêu cầu có chữ ký không hợp lệ. Bạn cũng có thể cần bao gồm một tham số bổ sung với yêu cầu xác định tài khoản người dùng thực hiện yêu cầu.

Điều này sẽ cung cấp xác thực yêu cầu, nhưng không bảo mật hoặc ngăn chặn phát lại và khách hàng sẽ nhận được phản hồi xác thực từ máy chủ.

Tôi đề nghị gửi tất cả các yêu cầu qua https (không phải http). Điều này sẽ cung cấp một mức độ bảo mật bổ sung chống lại một số trường hợp khó khăn. Ý nghĩa về hiệu suất của việc thực hiện việc này ít hơn bạn nghĩ - SSL có chi phí hoạt động ít hơn so với hầu hết mọi người nghĩ - vì vậy không loại bỏ ý tưởng này trên cơ sở hiệu suất trừ khi bạn thực sự đo chi phí hoạt động và thấy nó không được chấp nhận.

Những điều bổ sung cần chú ý. Bạn có thể muốn sử dụng một lần sử dụng một lần, để ngăn phát lại các yêu cầu được xác thực. Tôi đề nghị sử dụng giá trị ngẫu nhiên cường độ mã hóa (dài ít nhất 64 bit). Điều này là không cần thiết nếu bạn đang sử dụng https.

Đảm bảo rằng máy chủ của bạn được viết để bảo vệ chống lại các cuộc tấn công Ô nhiễm tham số máy chủ (HPP) . Chẳng hạn, nó sẽ từ chối mọi yêu cầu có nhiều tham số yêu cầu cùng loại (ví dụ: http://example.com/foo.html?name=x&name=y). Ngoài ra, khi viết mã máy chủ, hãy cẩn thận khi tạo yêu cầu mới dựa trên yêu cầu bạn nhận được. Chẳng hạn, trước khi xử lý từng yêu cầu, mã máy chủ của bạn có thể xác thực rằng yêu cầu chỉ đi kèm với danh sách các tham số dự kiến ​​và không có gì nữa; loại bỏ các tham số trùng lặp hoặc tham số không mong muốn trước khi xử lý yêu cầu.

Coi chừng lỗ hổng nối nếu bạn quyết định bảo vệ nhiều giá trị bằng mã xác thực thư.

37
D.W.