Bảo mật API REST: HMAC / băm khóa so với JWT


16

Tôi mới đọc bài viết này đã vài năm tuổi nhưng mô tả một cách thông minh để bảo mật API REST của bạn. Bản chất:

  • Mỗi khách hàng có một cặp khóa công khai / riêng
  • Chỉ có máy khách và máy chủ biết khóa riêng; nó không bao giờ được gửi qua dây
  • Với mỗi yêu cầu, khách hàng nhận một số đầu vào (toàn bộ chính yêu cầu, dấu thời gian hiện tại và khóa riêng) và chạy chúng thông qua chức năng HMAC để tạo ra hàm băm của yêu cầu
  • Sau đó, khách hàng sẽ gửi yêu cầu bình thường (chứa khóa chung) và hàm băm đến máy chủ
  • Máy chủ tra cứu khóa riêng của khách hàng (dựa trên khóa chung được cung cấp) và thực hiện kiểm tra dấu thời gian (mà tôi không hiểu) xác minh rằng yêu cầu không phải là nạn nhân của một cuộc tấn công phát lại
  • Nếu tất cả đều ổn, thì máy chủ sẽ sử dụng khóa riêng và cùng chức năng HMAC để tạo ra hàm băm của yêu cầu
  • Sau đó, máy chủ sẽ so sánh cả hai giá trị băm (cái được gửi bởi máy khách cũng như cái mà nó tạo ra); nếu chúng khớp, yêu cầu được xác thực và được phép tiến hành

Sau đó tôi tình cờ gặp JWT , nghe có vẻ rất giống nhau. Tuy nhiên, bài viết đầu tiên hoàn toàn không đề cập đến JWT, và vì vậy tôi tự hỏi liệu JWT có khác với giải pháp xác thực ở trên không, và nếu có thì làm thế nào.


1
Lol ... Tôi chỉ muốn hỏi cùng một câu hỏi chính xác và tình cờ gặp bạn. Một trong những điều đầu tiên tôi tìm thấy về xác thực không trạng thái là từ AWS: docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/ , và đã triển khai một cái gì đó như massimilianosciacco.com/ . Sau đó, tôi tìm thấy JWS / JWT và nó tương tự như vậy. Nhưng theo tôi hiểu JWT là một tiêu chuẩn và các giải pháp khác được mô tả ở trên là một số triển khai tùy chỉnh (không được tiêu chuẩn hóa). Ai đó sửa tôi nếu tôi sai.
nyxz

2
Thật tốt khi biết tôi không phải là người duy nhất lo lắng về những loại chi tiết này! JWT chắc chắn cảm thấy tương tự, và phần thưởng là nó được chuẩn hóa. Tôi chỉ tự hỏi làm thế nào nó hội chợ (bảo mật-khôn ngoan) với giải pháp HMAC tùy chỉnh này.
smeeb

Câu trả lời:


7

Hãy bắt đầu điều này với một câu trả lời rất cơ bản.

JWT (như được sử dụng trong ngữ cảnh của OAuth và OpenID) không yêu cầu các bí mật chung giữa máy khách và API. Có 3 thành phần và cặp 2 chia sẻ một bí mật: máy khách nhận dạng <->, máy chủ nhận dạng <-> API.

Điều này di chuyển phức tạp nhất từ ​​API sang máy chủ nhận dạng, API chỉ cần kiểm tra xem mã thông báo đã được phát hành bởi máy chủ nhận dạng và không được xử lý. Để xác minh rằng API kiểm tra chữ ký JWT có hợp lệ với bí mật được chia sẻ duy nhất đã biết giữa máy chủ nhận dạng và API không. Đó là nó!

Cách máy chủ nhận dạng xác thực danh tính người dùng có thể khác nhau rất nhiều (trong nhiều trường hợp, đó là cặp tên người dùng + mật khẩu cũ qua kết nối TLS), nhưng không ảnh hưởng đến API của bạn.

Quyền riêng tư và bảo mật của tin nhắn và mã thông báo khi sử dụng JWT được TLS xử lý, JWT không biết gì về các vấn đề đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.