2012-07-06 45 views
22

Câu trả lời được chấp nhận ở đây là để why OAuth2 access tokens expire:Mã thông báo truy cập OAuth2 cho ứng dụng dành cho thiết bị di động có hết hạn không?

  • Nhiều nhà cung cấp hỗ trợ thẻ vô danh mà là an ninh-khôn ngoan rất yếu. Bằng cách làm cho chúng tồn tại trong thời gian ngắn và yêu cầu làm mới, chúng hạn chế thời gian kẻ tấn công có thể lạm dụng mã thông báo bị đánh cắp. (Điều này có nghĩa là gì? Tôi lấy nó để có nghĩa là cho phép truyền mà không có TLS? Còn gì khác không?).
  • Triển khai quy mô lớn không muốn thực hiện tra cứu cơ sở dữ liệu mỗi cuộc gọi API, do đó, thay vào đó họ phát hành mã thông báo truy cập được mã hóa tự động có thể được xác minh bằng cách giải mã. Tuy nhiên, điều này cũng có nghĩa là không có cách nào để thu hồi các thẻ này để chúng được phát hành trong một thời gian ngắn và phải được làm mới.
  • Mã thông báo làm mới yêu cầu xác thực ứng dụng khách làm cho nó mạnh hơn. Không giống như các mã thông báo truy cập ở trên, nó thường được thực hiện với tra cứu cơ sở dữ liệu.

Giả sử rằng chúng tôi không hỗ trợ mã truyền truy cập không mã hóa sẽ xử lý dấu đầu dòng đầu tiên.

Giả sử rằng chúng tôi thực hiện tốt việc tra cứu cơ sở dữ liệu đối với mã thông báo truy cập hoàn toàn ngẫu nhiên có thể quay lại, sẽ xử lý mã thông báo thứ hai.

Đối với ứng dụng dành cho thiết bị di động, xác thực ứng dụng khách không thể mạnh hơn, bởi vì "client_id và client_secret thu được khi đăng ký được nhúng vào mã nguồn của ứng dụng của bạn. Trong ngữ cảnh này, client_secret rõ ràng không được coi là bí mật". (Google). Điều đó giúp loại bỏ mối quan tâm thứ ba.

Vì vậy, lợi ích của việc tách mã thông báo truy cập thời gian tồn tại và mã thông báo làm mới tồn tại lâu dài trong trường hợp này là gì? Có phải "được" để chỉ phát hành mã thông báo truy cập không hết hạn và bỏ qua toàn bộ phần mã thông báo làm mới không?

Trả lời

30

Sự khác biệt giữa mã thông báo làm mới và mã thông báo truy cập không hết hạn trong phương tiện bảo mật là một cuộc gọi bổ sung tới máy chủ ủy quyền.

Nếu kẻ tấn công có quyền truy cập vào mã thông báo truy cập không giới hạn không giới hạn của bạn, anh ấy có thể gọi trực tiếp máy chủ tài nguyên của bạn và nhận dữ liệu bí mật dưới dạng phản hồi.
Bây giờ, nếu anh ta đánh cắp mã thông báo làm mới của mình, trước tiên anh ấy phải gọi cho máy chủ ủy quyền và nhận mã thông báo truy cập để phản hồi. Sau đó, anh ta có thể truy vấn máy chủ tài nguyên để có dữ liệu bí mật.

Mỗi lần mã thông báo truy cập được yêu cầu từ máy chủ ủy quyền của bạn bằng mã thông báo làm mới, thông số OAuth 2 (ít nhất là bản nháp mới nhất hiện tại) yêu cầu máy chủ phải check the client identity and if it is bound to the token, nếu có thể.

Khi cách tiếp cận bình thường với bí mật của khách hàng không hoạt động để xác định một ứng dụng được cài đặt trên nền tảng mở, nền tảng chạy ứng dụng phải cung cấp các phương pháp để thực hiện việc này. Google, v.d. yêu cầu các nhà phát triển phải ký tên vào các ứng dụng Android. Khi yêu cầu thông tin xác thực cho ứng dụng Android bằng cách sử dụng Google API Console, do đó bạn phải chỉ định the fingerprint of the certificate you used for signing the application và chỉ nhận được ID ứng dụng khách, nhưng không có phản hồi bí mật. Khi phát hành mã thông báo, sau đó Google có thể quyết định xem ứng dụng có được nhà phát triển ủy quyền yêu cầu mã thông báo trong tên của anh ấy hay không.

Nếu bạn chắc chắn không thể xác minh danh tính khách hàng, ít nhất có thể trong một số trường hợp để nhận ra rằng mã thông báo làm mới đã bị đánh cắp. Thông số kỹ thuật có một số example for this:

Khi không thể xác thực ứng dụng khách, máy chủ ủy quyền NÊN triển khai các phương tiện khác để phát hiện lạm dụng mã thông báo làm mới.

Ví dụ: máy chủ ủy quyền có thể sử dụng xoay mã thông báo làm mới, trong đó mã thông báo làm mới mới được phát hành với mọi phản hồi làm mới mã thông báo truy cập. Mã thông báo làm mới trước không hợp lệ nhưng được máy chủ ủy quyền giữ lại. Nếu mã thông báo làm mới bị xâm phạm và sau đó được cả kẻ tấn công và khách hàng hợp pháp sử dụng, một trong số họ sẽ hiển thị mã thông báo làm mới không hợp lệ, mã thông báo này sẽ thông báo cho máy chủ ủy quyền về vi phạm.

+0

"Khi phát hành mã thông báo, Google có thể quyết định xem ứng dụng có được nhà phát triển ủy quyền yêu cầu mã thông báo trong tên của anh ấy hay không". Làm thế nào để họ làm điều đó? Hệ điều hành Android có đang ngồi giữa ứng dụng và mạng không, chứng minh rằng ứng dụng được ký đúng cách? – Thilo

+2

Trên Android, bạn có thể sử dụng lớp ['AccountManager'] (https://developer.android.com/reference/android/accounts/AccountManager.html) để xử lý mã thông báo và ủy quyền, dịch vụ cho Google đã được tích hợp sẵn trong đó. Tôi không nghĩ rằng họ đã sử dụng kiểm tra chữ ký ứng dụng, mà là một cách tiếp cận thông tin khách hàng. Việc kiểm tra chữ ký được công bố trong một cuộc trò chuyện [Google I/O 2012 của Yaniv Inbar] (http://www.youtube.com/watch?v=dylFNrvZ_3U), phần thú vị là [10:41] (http://www.youtube.com/watch?v=dylFNrvZ_3U&hd=1&t=10m41s). –

+0

Dự án được gọi là [Dịch vụ của Google Play] (https://developers.google.com/android/google-play-services/). –

2

Vấn đề lớn nhất với mã thông báo truy cập không hết hạn là không có cơ chế để thay thế mã thông báo bị đánh cắp. Nếu tôi có quyền truy cập vào mã thông báo truy cập không hết hạn của bạn, thì tôi thực sự là bạn cho hệ thống đó. Nếu mã thông báo tồn tại trong thời gian ngắn và hết hạn, thì có một cơ chế để thay thế mã thông báo bị đánh cắp và giới hạn trên cửa sổ mà tôi phải bẻ khóa mã thông báo của bạn.

Giả sử tôi mất 3 giờ để bẻ khóa gói và nhận mã thông báo, nhưng mã thông báo truy cập chỉ tốt trong hai giờ. Sau đó, vào thời điểm tôi không thể đột nhập vào tài khoản của bạn, mã thông báo đã thay đổi và tôi phải bắt đầu lại. Nếu mã thông báo không hết hạn, thì tôi có toàn quyền truy cập vào tài khoản của bạn và bạn không có cách nào để thay thế mã thông báo đó bằng cách xóa mã thông báo và buộc ủy quyền lại.

+3

Nhưng vấn đề tương tự này không áp dụng cho mã thông báo làm mới, được phát hành, lưu trữ và sử dụng giống như mã thông báo truy cập và không hết hạn sớm? Vậy sự an toàn bổ sung ở đâu? Không tồn tại mã thông báo làm mới lâu này hoàn toàn làm suy yếu các lợi ích của việc có mã thông báo truy cập trong thời gian ngắn không? – Thilo

+2

Mã thông báo làm mới chỉ được sử dụng để nhận mã thông báo truy cập mới, do đó, có ít hiển thị quảng cáo hơn. Mã thông báo làm mới chỉ được gửi trong phần nội dung của thông báo được mã hóa SSL, không bao giờ trong tiêu đề. Và mã thông báo làm mới cũng yêu cầu client_id và client_secret để xác thực bổ sung. Vì vậy, ít rủi ro của mã thông báo làm mới bị rò rỉ hơn mã thông báo truy cập. –

+0

Trong câu hỏi tôi đã giả định rằng chỉ SSL được sử dụng. Ngoài ra, client_id và client_secret là thông tin công khai trong luồng thiết bị di động. Tôi thành thật không thấy làm thế nào các mã thông báo làm mới là an toàn hơn để rò rỉ hơn mã thông báo truy cập trong kịch bản này (ngoại trừ có thể cho thực tế là nó được sử dụng chỉ mỗi ba mươi phút thay vì mỗi ba mươi giây). – Thilo

-1

Mã thông báo truy cập OAuth2 không phải hết hạn (hoặc đúng hơn, nhưng có thể nhiều năm).

Mã thông báo truy cập có thể được sử dụng ONCE để thu được một số tài nguyên nhất định từ máy chủ tài nguyên, cụ thể là nó cho phép mua lại các tài nguyên đó được người dùng phê duyệt. Mặt khác, mã thông báo làm mới cho phép truy cập lặp lại. Vì vậy, người ta không thể loại bỏ mã thông báo làm mới mà không yêu cầu sự tương tác của người dùng giữa mọi truy cập.

Nói chung, đôi khi, mã thông báo đôi khi có thể bị các ứng dụng độc hại khác đánh cắp trên cùng một thiết bị hoặc bằng cách tấn công MITM trên điện thoại. SSL là MITM-có thể nếu điện thoại có thể được thực hiện để tin tưởng một giấy chứng nhận tinh ranh. Điều này đôi khi được yêu cầu bởi các công ty để truy cập vào mạng nội bộ (họ yêu cầu chấp nhận một chứng chỉ tự ký, cho phép họ MITM tất cả lưu lượng được mã hóa xảy ra trên mạng công ty.

Mã thông báo mang không kém hơn bất kỳ hình thức mã thông báo nào khác, như được minh chứng trong một loạt các giấy tờ (bao gồm một trong số các giấy tờ của tôi, mà tôi sẽ đăng liên kết đến khi tôi có thể khai thác nó.) Tuy nhiên, mã thông báo mang chỉ thích hợp trong trường hợp các giả định mà chúng tạo ra là hợp lệ, giả sử rằng mã thông báo có thể được giữ bí mật là một giả định chính về các mã thông báo của người mang nói chung. (mặc dù một số vẫn giữ) Xem NIST Level 3 tokens, trong đó xác định những gì các thẻ tấn công mang dấu phải đánh bại, như s pecified in OAuth Bearer Tokens. Trong các thẻ mang ngắn không được đánh cắp mã thông báo.

Mã thông báo của người gửi không thể bị thu hồi, điều đó là đúng. Tuy nhiên, do kiểu truy cập thông thường là sử dụng mã thông báo truy cập ngay lập tức sau khi mua, bạn nên sử dụng mã thông báo truy cập một cách nhanh chóng để ngăn chặn lạm dụng tiềm ẩn, ngay cả khi trường hợp lạm dụng không thể hiện lên. Thẻ càng dài càng có nhiều khả năng bị đánh cắp. Một mã thông báo làm mới thực sự nguy hiểm hơn nhiều khi bị đánh cắp, vì nó cung cấp quyền truy cập lặp lại trong một khung thời gian dài hơn, nếu bạn không thể bảo mật id ứng dụng khách. OAuth2 có thể cung cấp quyền truy cập vào tài nguyên nói chung và do đó, ví dụ: có thể được sử dụng để hiển thị API cho khách hàng trong một thời gian. Với một mã thông báo làm mới đáng kể thiệt hại nhiều hơn có thể được thực hiện, như trái ngược với một mã thông báo sử dụng duy nhất.

Xác thực ứng dụng khách thực tế có thể được đảm bảo an toàn hơn bằng nhiều cách, ví dụ, cho mỗi khách hàng tải xuống một khóa khác nhau. Điều này ngăn chặn các cuộc tấn công tổng quát mà kỹ thuật đảo ngược một mã thông báo trên một thiết bị phá vỡ bảo mật cho tất cả các trường hợp của máy khách. Các kỹ thuật tiềm năng khác bao gồm sử dụng OAuth để xác minh máy khách với máy chủ của bạn, sau đó thực hiện lần chạy thứ hai của giao thức OAuth với máy chủ ủy quyền mà bạn muốn truy cập. Điều này sau đó cho phép bạn có khách hàng cập nhật khóa của họ thường xuyên, và cho tất cả họ có các khóa khác nhau, trong khi không đặt gánh nặng quá mức vào các hệ thống được sử dụng bởi máy chủ ủy quyền thuộc sở hữu của Facebook hoặc Google chẳng hạn.

Khi sử dụng ứng dụng dành cho thiết bị di động, mã thông báo làm mới tồn tại lâu hơn an toàn hơn so với mã thông báo mang nhiều người dùng, ngay cả khi không thực hiện các bước để bảo mật ứng dụng khách. Điều này là do người dùng không thể hết hạn mã thông báo. Nếu mã thông báo làm mới không bị đánh cắp và người dùng chỉ muốn thu hồi quyền truy cập thì điều này có thể được thực hiện. Không thể thu hồi mã thông báo mang nhiều người dùng ngay cả khi người dùng chỉ muốn thu hồi quyền truy cập. Mã thông báo tham chiếu cơ sở dữ liệu đa sử dụng có thể được thu hồi rõ ràng, nhưng đây không phải là giao thức được thiết kế và do đó các phân tích bảo mật đã được thực hiện trên OAuth không nói bất cứ điều gì về bảo mật của hệ thống lai này.

Kết luận tôi khuyên bạn nên sử dụng mã thông báo làm mới và mã thông báo cơ sở dữ liệu vì đây là cách có nhiều khả năng bảo mật nhất. Nếu bạn có thể làm bất cứ điều gì để bảo vệ khách hàng đó là tiền thưởng, nhưng các tình huống bảo vệ chống lại này là tối thiểu. Nếu bạn muốn bảo đảm máy khách xem xét các mã thông báo mềm, một trình xác thực la google, vì đây là một triển khai vững chắc đã chịu đựng sự phân tích của một số người rất thông minh.

+0

"Mã thông báo truy cập có thể được sử dụng ONCE": Bạn có liên kết cho điều đó không? Sự hiểu biết của tôi là nó có thể được sử dụng một số lần không giới hạn cho đến khi nó hết hạn. – Thilo

+0

"Không thể thu hồi mã thông báo của người gửi, điều đó là đúng.": Tại sao vậy? Nếu mã thông báo được hỗ trợ bởi một mục trong cơ sở dữ liệu, bạn có thể xóa mục nhập đó. – Thilo

+0

Một mã thông báo mang, theo định nghĩa, chứa tất cả thông tin cần thiết để truy cập tài nguyên từ máy chủ tài nguyên mà không cần phải kiểm tra cơ sở dữ liệu. Đó là điểm của một mã thông báo mang, rằng nó giống như một lưu ý ngân hàng, chỉ sở hữu là đủ mà không cần xác thực thêm. Nếu bạn đang kiểm tra đối với một cơ sở dữ liệu thì nó không còn là một mã thông báo mang. Thực tế là một mã thông báo truy cập có thể được sử dụng một lần có thể được lấy từ thực tế là nó có chứa một giá trị không sử dụng hoặc một giá trị sử dụng duy nhất. Một số triển khai hiện tại không kiểm tra điều này, nhưng về mặt kỹ thuật chúng không tuân thủ đặc điểm kỹ thuật. – jhoyla

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