2012-08-06 9 views
5

Vì vậy, tôi đang làm việc trên một ứng dụng dành cho thiết bị di động ngay bây giờ sẽ đưa ra yêu cầu cho một API REST được xây dựng với Django.Tôi làm cách nào để chia sẻ khóa bí mật của ứng dụng dành cho thiết bị di động của mình với máy chủ trong lần đầu tiên tôi tạo nó?

Để đảm bảo API tôi có kế hoạch sử dụng hệ thống xác thực cặp khóa riêng/công khai.

Các quy trình làm việc tôi đã nghĩ ra đi một cái gì đó như thế này:

  1. Các người dùng đăng nhập qua tài khoản Facebook
  2. Khi người dùng ký ứng dụng tạo ra một chìa khóa
  3. Khóa bí mật cá nhân được chia sẻ giữa các máy chủ và ứng dụng sao cho máy chủ biết để ánh xạ khóa riêng đó cho một người dùng cụ thể.
  4. Mỗi khi ứng dụng dành cho thiết bị di động đưa ra yêu cầu, ứng dụng sẽ tạo ra HMAC/chữ ký bằng thông số yêu cầu và khóa cá nhân. Ngoài HMAC, ứng dụng còn gửi user_id của người dùng đã gửi nó (điều này sẽ hoạt động như khóa công khai).
  5. Khi máy chủ nhận được yêu cầu, nó tạo ra HMAC riêng của mình. Nó lấy user_id và tra cứu khóa riêng trong một bảng. Sử dụng khóa riêng, nó tạo lại HMAC với các tham số yêu cầu và so sánh nó với HMAC mà ứng dụng di động đã gửi. Nếu máy chủ và thiết bị di động có các HMAC phù hợp thì nó sẽ thực hiện yêu cầu.

Hiện tại, sự cố của tôi nằm ở bước 3 trong đó khóa cá nhân phải được chia sẻ bằng cách nào đó giữa ứng dụng dành cho thiết bị di động và máy chủ. Làm thế nào tôi có thể gửi khóa riêng tư một cách an toàn?

Trả lời

4

Tôi sẽ bắt đầu bằng cách hỏi lý do tại sao phần máy chủ của ứng dụng của bạn cần phải biết khóa riêng tư. Nếu nó chỉ muốn xác thực người dùng, nó chỉ cần khóa công cộng và id người dùng, và id người dùng không thể là chính khóa công khai (bạn cần một cách để tìm ra khóa công khai nào để sử dụng).

Ví dụ, quá trình chia sẻ chìa khóa, mỗi bước chân ba, có thể giống như thế này:

  1. Ứng dụng tạo ra một cặp khóa công-tư.
  2. Ứng dụng gửi khóa công khai đến máy chủ, không quan tâm ai có thể chặn nó.
  3. Máy chủ lưu trữ khóa công khai đó, liên kết nó với id mà người dùng đã cung cấp.

Có thể việc tích hợp vào Facebook là một phần khiến điều này không thể thực hiện được. Tôi không hoàn toàn hiểu cách Facebook đi vào toàn bộ quá trình này.

Một điều có thể làm cho việc chuyển giao khóa một cách an toàn hơn một chút là sử dụng nhiều kênh để truyền. Ví dụ, ứng dụng của bạn có thể gửi khóa riêng được tạo ra bằng cách sử dụng REST API của bạn nhưng mã hóa nó với một lược đồ mã hóa đối xứng. Khóa mã hóa đối xứng có thể được gửi qua một số phương tiện khác, chẳng hạn như email hoặc qua SMS vì đây là ứng dụng dành cho thiết bị di động hoặc thậm chí là cuộc gọi tự động được đặt cho một số do người dùng đăng ký cung cấp. Chìa khóa có thể là cụm mật khẩu ngẫu nhiên tạo khóa mã hóa đối xứng thực, để đảm bảo rằng nó là thứ có thể được người dùng nhập vào. Sau đó, để mở khóa ứng dụng, người dùng cần nhập cụm mật khẩu này vào màn hình và khóa bí mật được mở khóa.

Một lần nữa, điều này chỉ cải thiện tính bảo mật của chuyển khoản bằng một lề nhỏ, đặc biệt là nếu bạn có thể chặn việc truyền khóa riêng tư, bạn có thể chặn email chứa cụm mật khẩu. Theo ý kiến ​​của tôi, không gửi khóa riêng đến máy chủ sẽ không chỉ tối ưu mà còn được yêu cầu.