Xác thực API, mã thông báo một lần VS Mã thông báo động


13

Chúng tôi đang làm việc trên một dự án mới, chúng tôi là hai nhà phát triển chính và đang gặp khó khăn về cách sử dụng mã thông báo để bảo mật thông tin liên lạc giữa máy chủ và máy khách.

Đề xuất đầu tiên: (Mã thông báo tĩnh AKA một lần)

  1. máy khách yêu cầu mã thông báo chính, bằng cách gửi tên người dùng và mật khẩu và current_time (biến này sẽ được lưu trong cơ sở dữ liệu của máy chủ và phía máy khách) đến api, máy chủ diễn giải đầu vào và hiển thị mã thông báo được băm (ví dụ: 58f52c075aca5d3e07869598c4d66648) lưu nó trong cơ sở dữ liệu và trả lại cho khách hàng.

  2. Hiện tại khách hàng lưu mã thông báo chính và tạo mã thông báo được băm mới bằng cách sử dụng mã thông báo chính + biến current_time được gửi trong yêu cầu xác thực (hãy gọi mã thông báo mới này, main_token) cũng là máy chủ thực hiện tương tự và tạo cùng một mã thông báo bằng thuật toán tương tự .

  3. Mỗi lần máy khách truy vấn API máy chủ, nó sẽ gửi main_token đến máy chủ, bây giờ máy chủ sẽ so sánh mã thông báo được tạo trong nó, với main_token được gửi bởi máy khách, nếu nó khớp, điều đó có nghĩa là người dùng là thật

Đề xuất thứ hai: (Mã thông báo động)

  1. Máy khách tạo hai khóa ngẫu nhiên ($ key1 = rand (10000,90000); $ key2 = rand (10000,90000);) Trên mỗi yêu cầu trên API, máy khách tạo ra một hàm băm bằng cách sử dụng loại truy vấn và hai khóa với một thuật toán phức tạp và gửi hai khóa này + hàm băm đến máy chủ

  2. Máy chủ, sử dụng cùng một Thuật toán được sử dụng trong máy khách, tạo ra một hàm băm và so sánh với một thuật toán được gửi bởi máy khách, nếu nó phù hợp, máy chủ tiến hành xử lý truy vấn


Bây giờ, câu hỏi là, cách nào là hợp lý và an toàn nhất để sử dụng để bảo mật các yêu cầu API?


2
Làm thế nào là thứ hai thậm chí là một phương tiện xác thực? Có phải là cái gì đó có nguồn gốc từ các máy chủ mà những ứng dụng client trong kỹ thuật auth, nếu không có cách nào để biết nếu khách hàng chỉ cần thực hiện lên phím. Trong kỹ thuật thứ hai, máy chủ bắt nguồn từ cái gì khi đăng nhập hoàn thành mà nó cung cấp cho máy khách để đảm bảo máy khách giống với cái mà nó đã cho?
Jimmy Hoffa

1
Có lẽ tôi đang thiếu một cái gì đó ... nhưng tại sao không sử dụng OAuth làm cơ chế xác thực? Nó là tiêu chuẩn và sẽ có thư viện cho khách hàng của bạn sử dụng trong mọi ngôn ngữ.
Icode4food 8/2/2016

Câu trả lời:


14

Tôi thực sự thích cách tiếp cận đầu tiên nói chung.

  • thật đơn giản để hiểu và thực hiện
  • nó an toàn (theo hiểu biết của tôi)
  • đó là một cách tiếp cận không phổ biến mà tôi đã thấy được sử dụng trong quá khứ

Một điều tôi không thấy được đề cập về điều đầu tiên mà bạn nên ghi nhớ, dấu thời gian được sử dụng để băm mã thông báo cần có thời hạn sử dụng TTL quá ngắn (như 1 giây) để bạn xác minh tin nhắn không được gửi cùng với cùng dấu thời gian và mã thông báo từ một tin nhắn 12 giờ trước đó; rõ ràng nó sẽ tính toán là hợp pháp nhưng không phải trong trường hợp này.

Nếu đây là hai lựa chọn duy nhất bạn đang xem xét mặc dù tôi chỉ muốn chắc chắn rằng bạn cũng đã xem các cách tiếp cận khác, vì có rất nhiều lựa chọn. Thực tế hơn là tôi sẽ liệt kê. Đây là một số cách tiếp cận xác thực phổ biến đáng để nghiên cứu chỉ để xem liệu chúng có phù hợp với mục đích của bạn hơn không, và nếu không có gì khác hiểu chúng có thể cung cấp cho bạn một số ý tưởng để giúp thắt chặt bất kỳ cách tiếp cận nào bạn thực hiện.

Xin lưu ý, tôi không phải là một chuyên gia bảo mật.


OAuth / Liên kết

Theo cách tiếp cận này, bạn có một người bảo lãnh bên thứ 3 trong đó mã tiêu thụ yêu cầu mã thông báo / cert / bạn có gì từ họ và chuyển nó cho bạn, tại thời điểm này, tất cả những gì bạn cần làm là hỏi bên thứ 3 xem khóa bạn đã đưa là hợp pháp

Chuyên nghiệp:

  • Tiêu chuẩn dựa trên
  • Các vấn đề sẽ được tìm thấy bởi những người khác trên hệ thống của người khác, vì vậy bạn sẽ tìm ra nếu sự không an toàn xảy ra
  • Bạn sẽ cần ít công việc xác thực hơn

Con:

  • Bạn phải đối phó với người phục vụ bên thứ 3 và API của họ hoặc tạo và lưu trữ "bên thứ 3" của riêng bạn để tách biệt auth ra khỏi dịch vụ chính của bạn.
  • Đối với nhiều dịch vụ quá mức cần thiết, nhưng về mặt khái niệm đáng để xem xét

Chứng chỉ không đồng bộ

Tại đây, khách hàng của bạn sẽ mã hóa thông tin liên lạc của họ bằng một chứng chỉ công khai mà bạn đã chia sẻ với họ khi họ tạo người dùng. Về phía bạn, bạn sẽ giải mã bằng khóa riêng được liên kết với người dùng đó. Nói chung, bạn sẽ bắt đầu giao tiếp với một phản ứng thách thức để cho thấy họ có thể mã hóa / giải mã như bạn mong muốn xác định họ là người mà họ tuyên bố là. Mặc dù các phương pháp "đồng bộ" có thể không sử dụng phản hồi thách thức, nhưng chúng có ít bảo mật hơn và một số vấn đề đồng bộ hóa thời gian có thể khiến chúng khó khăn hơn.

từ Novell (vâng tôi biết, novell? thật sao?)

Mã thông báo sử dụng một biến làm cơ sở để tạo mật khẩu một lần. Biến này được gọi là thách thức. Hai phương thức chính để xác định biến được sử dụng để tạo mật khẩu là không đồng bộ hoặc đồng bộ.

Với phương thức phản hồi không đồng bộ hoặc phản hồi thách thức, phần mềm máy chủ sẽ gửi mã thông báo cho thử thách bên ngoài --- một biến được tạo ngẫu nhiên --- để thiết bị mã thông báo mã hóa. Mã thông báo sử dụng biến thách thức này, thuật toán mã hóa và bí mật được chia sẻ để tạo phản hồi --- mật khẩu được mã hóa chính xác.

Với phương thức đồng bộ, biến thách thức được sử dụng để tạo mật khẩu được xác định bên trong bởi mã thông báo và máy chủ. Bộ đếm thời gian, bộ đếm sự kiện hoặc kết hợp bộ đếm thời gian và bộ đếm sự kiện trong mỗi thiết bị được sử dụng làm cơ sở cho biến thách thức. Bởi vì mã thông báo và máy chủ mỗi loại riêng biệt và bên trong xác định biến thách thức từ bộ đếm riêng của chúng, điều rất quan trọng đối với bộ đếm thời gian của chúng và bộ đếm sự kiện để được đồng bộ hóa. Vì rất dễ dàng cho máy chủ và mã thông báo không đồng bộ hóa, nên hầu hết các triển khai đều cho phép một lượng trôi nhất định giữa các quầy. Thông thường, một phạm vi nhỏ hoặc cửa sổ của các giá trị truy cập này được sử dụng để tính mật khẩu. Tuy nhiên, nếu mã thông báo và máy chủ không đồng bộ hóa ngoài cửa sổ này,

Chuyên nghiệp:

  • Chứng chỉ có gốc CA khiến chúng đáng tin cậy và khó giả mạo
  • Có các cơ sở tiêu chuẩn trong các hệ điều hành để quản lý và duy trì các cửa hàng chứng nhận một cách dễ dàng
  • Phương pháp nghiên cứu tốt, rất nhiều thông tin có sẵn về nó
  • Hết hạn cùng với một loạt các thứ khác là các cơ sở được xây dựng của các chứng chỉ tiêu chuẩn, nhìn chung chúng rất mạnh mẽ

Con:

  • Chứng chỉ có thể khó để làm việc với lập trình
  • Tùy thuộc vào nếu bạn yêu cầu CA bên ngoài, có thể không miễn phí
  • Có thể cần duy trì các cửa hàng chứng chỉ theo cách thủ công để đảm bảo các ủy thác gốc dự kiến ​​được định cấu hình

NTLM

Đừng cười, nếu đây là dịch vụ nhỏ hơn hoặc chỉ nội bộ và bạn đang ở trong môi trường windows, không có gì sai khi sử dụng xác thực NTLM tiêu chuẩn để đảm bảo quyền truy cập. Đặc biệt, nếu bạn đang làm việc với IIS, đây là cách tiếp cận đơn giản nhất. Dễ dàng bảo trì và cấu hình tốt trong web.config.

Chuyên nghiệp:

  • Cực kỳ dễ dàng để cấu hình, thực hiện và bảo trì

Con:

  • Khả năng tương tác tối thiểu
  • Không đủ để xác thực đối mặt với công chúng

Nonces

Khi làm việc với nonces trong phương pháp xác thực của bạn, bạn cung cấp một phương thức để có được một thông tin về dịch vụ. Phương thức này trả về một chuỗi hoặc một đoạn dữ liệu tùy ý ("một nonce") cho mỗi yêu cầu. Bây giờ mọi yêu cầu đối với các phương thức khác đều yêu cầu một nonce để được truy xuất và được sử dụng trong thuật toán mật mã cho yêu cầu. Giá trị ở đây là máy chủ theo dõi các nonces được sử dụng và không bao giờ cho phép tái sử dụng nonce, điều này hoàn toàn ngăn chặn các cuộc tấn công phát lại bởi vì một khi yêu cầu với một nonce được thực hiện, một yêu cầu với nonce đó sẽ không bao giờ được thực hiện lại. Vì các nonces được yêu cầu, chúng được thêm vào danh sách các nonces có sẵn, vì chúng được sử dụng nên chúng được chuyển từ danh sách có sẵn sang danh sách đã sử dụng.

Chuyên nghiệp:

  • Thwarts phát lại các cuộc tấn công khá tốt
  • Không hoàn toàn khó thực hiện hoặc hiểu

Con:

  • Yêu cầu khách hàng thực hiện hai yêu cầu cho mỗi một yêu cầu (mặc dù có thể được giảm bớt bằng cách yêu cầu nonces chỉ cho một số yêu cầu nhất định )
  • Yêu cầu quản lý của nonces, cần được giao dịch
  • Ảnh hưởng tiêu cực đến hiệu suất bằng cách yêu cầu các yêu cầu bổ sung cho các lực lượng (giao dịch làm tăng thêm chi phí tài nguyên khi làm việc với các lực lượng)

Tôi nghi ngờ TTL có thể cần dài hơn một giây, mặc dù ngắn hơn một phút (giả sử HTTP / HTTPS là phương tiện vận chuyển). TTL phụ thuộc vào độ trễ thời gian vận chuyển (nghĩa là email dài hơn nhiều so với kết nối trực tiếp).
Donal Fellows

1
Bạn đã quên kerberos . Và tôi sẽ đưa ra một cảnh báo đặc biệt mạnh mẽ đối với việc cuộn gói xác thực / mã thông báo của riêng bạn như câu hỏi gợi ý. Auth auth rất dễ bị sai; một ví dụ sẽ sử dụng không gian khóa gieo chỉ 80.000 giá trị số 5 chữ số (từ trường hợp thứ 2 của OP). Bạn cũng phải cẩn thận trong những gì bạn sử dụng băm (từ trường hợp thứ 1). Nhiều người bây giờ bị phá vỡ tầm thường từ tra cứu bảng cầu vồng.

1
Cảm ơn bạn rất nhiều với câu trả lời, tôi đã chuyển từ dự án đó, nhưng tôi sẽ giữ Câu hỏi này trong mục yêu thích của tôi. Xin lỗi vì tôi đã không chấp nhận câu trả lời của bạn vì nó rất kỹ lưỡng. Nhưng, chuyện gì xảy ra với novell là xấu? :(
SAFAD

@SAFAD không có gì xấu về Novell, tôi chỉ bị ném khi tìm kiếm tài nguyên về các chi tiết bảo mật mà tôi đã tìm thấy thứ gì đó hiện đại từ Novell, tôi nghĩ rằng công ty đã chết từ rất lâu rồi .. Được cho là họ đi trước trò chơi vào thời của họ nhưng đó là một lâu lắm rồi Tôi đánh giá cao sự chấp nhận tất cả giống nhau, vì Glen ở trên đề cập đến nó có thể kỹ lưỡng hơn nhưng tôi đã cố gắng đưa ra một cái nhìn tổng quan đơn giản về các phương pháp thông thường. Kerberos là một giám sát khá lớn và là sự lựa chọn tốt .. tôi sẽ thêm nó ngay bây giờ ..
Jimmy Hoffa
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.