Bí mật OAuth trong ứng dụng di động


137

Khi sử dụng giao thức OAuth, bạn cần một chuỗi bí mật thu được từ dịch vụ bạn muốn ủy quyền. Nếu bạn đang làm điều này trong một ứng dụng web, bạn chỉ cần lưu trữ bí mật trong cơ sở dữ liệu của mình hoặc trên hệ thống tệp, nhưng cách tốt nhất để xử lý nó trong ứng dụng di động (hoặc ứng dụng máy tính để bàn cho vấn đề đó) là gì?

Lưu trữ chuỗi trong ứng dụng rõ ràng là không tốt, vì ai đó có thể dễ dàng tìm thấy nó và lạm dụng nó.

Một cách tiếp cận khác là lưu trữ nó trên máy chủ của bạn và để ứng dụng tải nó trên mỗi lần chạy, không bao giờ lưu trữ nó trên điện thoại. Điều này gần như là xấu, bởi vì bạn phải bao gồm URL trong ứng dụng.

Giải pháp khả thi duy nhất tôi có thể đưa ra là trước tiên hãy lấy Mã thông báo truy cập như bình thường (tốt nhất là sử dụng chế độ xem web bên trong ứng dụng), sau đó định tuyến tất cả thông tin liên lạc qua máy chủ của chúng tôi, sẽ nối thêm bí mật vào dữ liệu yêu cầu và liên lạc với nhà cung cấp. Sau đó, một lần nữa, tôi là một người không bảo mật, vì vậy tôi thực sự muốn nghe một số ý kiến ​​của người dân về vấn đề này. Đối với tôi, dường như hầu hết các ứng dụng sẽ không đảm bảo tính bảo mật (ví dụ: Facebook Connect dường như cho rằng bạn đặt bí mật vào một chuỗi ngay trong ứng dụng của mình).

Một điều khác: Tôi không tin rằng bí mật có liên quan đến việc yêu cầu Mã thông báo truy cập ban đầu, do đó có thể được thực hiện mà không liên quan đến máy chủ của chúng tôi. Tôi có đúng không?


Xin lỗi nếu tôi không hiểu rõ, nhưng vấn đề với việc lưu trữ mã trong cơ sở dữ liệu của ứng dụng là gì? Vì các mã thông báo đó được tạo và lưu trữ sau khi người dùng xác thực tài khoản của mình, do đó, sẽ an toàn khi cho rằng người dùng đó muốn thiết bị di động lưu trữ quyền truy cập để có quyền truy cập.
chọc

Ngay cả sau khi người dùng đã ủy quyền cho bạn truy cập vào tài khoản của họ (trên Twitter, giả sử), bạn phải sử dụng một bí mật mà bạn có được từ dịch vụ bạn đang cố gắng truy cập. Bí mật này được sử dụng trong tất cả các giao tiếp với máy chủ của họ, cùng với khóa xác thực và một số khóa khác. Vì vậy, có, bạn có thể lưu trữ khóa truy cập, nhưng bí mật không nên được lưu trữ, bởi vì nó có thể được sử dụng với bất kỳ khóa xác thực nào để lạm dụng dịch vụ. Một lần nữa, tôi sẽ rất vui khi được sửa chữa bởi những người biết nhiều hơn về điều này.
Felixyz

1
OAuth cung cấp một phương thức xác thực bảo mật dữ liệu đăng nhập của người dùng ban đầu. Để làm cho điều đó có thể kết hợp đăng nhập duy nhất mới được tạo ra chỉ hoạt động cùng với tổ hợp khóa của ứng dụng duy nhất . Lợi ích lớn đối với việc lưu trữ dữ liệu đăng nhập của người dùng là những dữ liệu đó hoàn toàn an toàn sau lần ủy quyền đầu tiên và trong mọi trường hợp vi phạm, người dùng chỉ cần thu hồi quyền truy cập của ủy quyền. Và tất nhiên, không lưu bí mật sẽ không có ý nghĩa vì người dùng sẽ cần phải xác nhận lại sau đó (và đó không phải là điều người dùng muốn khi cấp quyền truy cập ứng dụng).
chọc

@poke Khóa xác thực thu được khi người dùng phê duyệt ứng dụng của bạn với nhà cung cấp sẽ được lưu, nhưng mã thông báo bí mật mà bạn nhận được từ nhà cung cấp trước khi phát hành ứng dụng không nên (trong trường hợp ứng dụng dành cho máy tính để bàn hoặc thiết bị di động; một ứng dụng web rõ ràng bạn có thể lưu trữ khóa trên máy chủ, như đã nêu trong câu hỏi).
Felixyz

4
Theo hiểu biết của tôi về oAuth-- Trong trường hợp ứng dụng máy tính để bàn, bạn có thể dễ dàng đánh hơi / giám sát lưu lượng HTTP / HTTPS bằng các công cụ như eginspector.com/httpanalyzer/index.html Do đó, cả hai mã thông báo và mã thông báo của bạn đều có thể được tìm thấy dễ dàng Vì vậy, bảo vệ duy nhất là bí mật người tiêu dùng của bạn. Bây giờ nếu cửa hàng của bạn bí mật bên trong ứng dụng và ai đó có thể tìm thấy nó, nó sẽ trở thành một trò chơi trẻ con để mạo danh bất kỳ ứng dụng nào khác như ứng dụng của bạn. Đúng nếu tôi đã sai lầm.
Varun

Câu trả lời:


38

Vâng, đây là một vấn đề với thiết kế OAuth mà chúng ta đang phải đối mặt. Chúng tôi đã chọn proxy tất cả các cuộc gọi thông qua máy chủ của chúng tôi. OAuth hoàn toàn không bị loại bỏ đối với các ứng dụng máy tính để bàn. Không có giải pháp hoàn hảo cho vấn đề mà tôi đã tìm thấy mà không thay đổi OAuth.

Nếu bạn nghĩ về nó và đặt câu hỏi tại sao chúng tôi có bí mật, chủ yếu là để cung cấp và vô hiệu hóa các ứng dụng. Nếu bí mật của chúng tôi bị xâm phạm, thì nhà cung cấp chỉ có thể thực sự thu hồi toàn bộ ứng dụng. Vì chúng tôi phải nhúng bí mật của mình vào ứng dụng máy tính để bàn, chúng tôi rất khó chịu.

Giải pháp là có một bí mật khác nhau cho mỗi ứng dụng máy tính để bàn. OAuth không làm cho khái niệm này dễ dàng. Một cách là người dùng tự mình tạo một bí mật và tự nhập khóa vào ứng dụng trên máy tính để bàn của bạn (một số ứng dụng facebook đã làm điều tương tự trong một thời gian dài, để người dùng đi và tạo facebook để thiết lập các tùy chỉnh của họ và tào lao). Đó không phải là một trải nghiệm tuyệt vời cho người dùng.

Tôi đang làm việc theo đề xuất cho một hệ thống ủy quyền cho OAuth. Khái niệm là sử dụng khóa bí mật của riêng chúng tôi nhận được từ nhà cung cấp của chúng tôi, chúng tôi có thể phát hành bí mật được ủy quyền của riêng mình cho các khách hàng máy tính để bàn của riêng chúng tôi (một cho mỗi ứng dụng máy tính để bàn) và sau đó trong quá trình xác thực, chúng tôi gửi khóa đó lên cấp cao nhất nhà cung cấp gọi lại cho chúng tôi và xác nhận lại với chúng tôi. Bằng cách đó, chúng tôi có thể thu hồi các bí mật của riêng mình mà chúng tôi đưa ra cho mỗi khách hàng máy tính để bàn. (Mượn rất nhiều cách thức hoạt động của SSL này). Toàn bộ hệ thống này sẽ hoàn hảo cho các dịch vụ web giá trị gia tăng cũng như chuyển các cuộc gọi đến dịch vụ web của bên thứ ba.

Quá trình cũng có thể được thực hiện mà không cần gọi lại xác minh ủy quyền nếu nhà cung cấp cấp cao nhất cung cấp API để tạo và thu hồi các bí mật được ủy quyền mới. Facebook đang làm điều gì đó tương tự bằng cách cho phép các ứng dụng facebook cho phép người dùng tạo các ứng dụng phụ.

Có một số cuộc nói chuyện về vấn đề trực tuyến:

http://blog.atebits.com/2009/02/fixing-oauth/ http://groups.google.com/group/twitter-development-talk/browse_thread/thread/629b03475a3d78a1/de1071bf4b820c14#de1071bf4b20

Giải pháp của Twitter và Yammer là một giải pháp pin xác thực: https://dev.twitter.com/oauth/pin-basing https://www.yammer.com/api_oauth_security_addendum.html


Điều này rất thú vị, mặc dù nó xác nhận những gì tôi sợ, rằng OAuth không tuyệt vời cho các ứng dụng trên máy tính để bàn / thiết bị di động. Tất nhiên, một kẻ tấn công trước tiên sẽ phải có được bí mật và sau đó đánh hơi thông tin đăng nhập của ai đó, do đó sẽ mất khá nhiều quyết tâm. Giải pháp pin là ok cho máy tính để bàn nhưng nặng tay cho imo di động.
Felixyz

Chương trình đề xuất của bạn sẽ giúp các dịch vụ web giá trị gia tăng như thế nào, vì vấn đề này không áp dụng cho chúng? Ngoài ra, tôi không thấy nó hoạt động như thế nào với nhà cung cấp tạo ra các bí mật mới, vì bạn sẽ cần một "bí mật chính" để thậm chí yêu cầu những bí mật mới đó, vì vậy bạn ít nhất sẽ cần một cuộc gọi đến máy chủ của riêng bạn (nơi giữ máy bí mật chính). Nhưng điều đó tất nhiên tốt hơn là định tuyến tất cả lưu lượng truy cập thông qua máy chủ của riêng bạn. Làm rõ chào mừng nhất! Và xin vui lòng cập nhật ở đây khi đề xuất của bạn tiến triển!
Felixyz

5
Chỉ tò mò: làm thế nào để bạn xác định rằng việc thực hiện cuộc gọi đến máy chủ proxy của bạn là hợp pháp?
davidtbernal

1
Để đối phó với notJim: rủi ro chính trong việc cho phép bí mật người tiêu dùng của bạn thoát ra là các ứng dụng độc hại (hoặc dại dột) có thể được phát triển bằng cách sử dụng nó, làm mất danh tiếng của bạn và tăng nguy cơ bị tắt ứng dụng hợp pháp của bạn vì lạm dụng / lạm dụng API. Bằng cách ủy quyền tất cả các cuộc gọi yêu cầu bí mật của bạn thông qua ứng dụng web mà bạn kiểm soát, bạn sẽ quay lại vị trí bạn có thể theo dõi các kiểu lạm dụng và thu hồi quyền truy cập trên cấp độ người dùng hoặc truy cập mã thông báo trước khi API bạn tiêu thụ quyết định đóng xuống toàn bộ dịch vụ của bạn.
quasistoic

Tôi đồng ý với quasistoic ở đây, bạn sẽ cần sử dụng trình duyệt hỗ trợ SSL để xử lý cuộc gọi oauth. Đây là một điều tốt vì một vài lý do, bao gồm dễ dàng quản lý mọi cập nhật bảo mật trong tương lai và không có gì trong ứng dụng thực tế sẽ cần phải được cập nhật theo thời gian. Zac chỉ ra Twitter đề xuất một giải pháp PIN, điều mà tôi thực sự đã nghĩ đến, bởi vì bạn không thể tin tưởng vào ứng dụng để lấy mã một cách an toàn. Tôi đề nghị sử dụng 'Nonce' với mã hóa hiện đại cùng với mã PIN và bí mật để ủy quyền các yêu cầu thông qua máy chủ web.
Đánh dấu

18

Với OAUth 2.0, bạn có thể lưu trữ bí mật trên máy chủ. Sử dụng máy chủ để có được mã thông báo truy cập mà sau đó bạn chuyển sang ứng dụng và bạn có thể thực hiện cuộc gọi từ ứng dụng đến tài nguyên trực tiếp.

Với OAuth 1.0 (Twitter), cần có bí mật để thực hiện các cuộc gọi API. Các cuộc gọi ủy quyền qua máy chủ là cách duy nhất để đảm bảo bí mật không bị xâm phạm.

Cả hai đều yêu cầu một số cơ chế mà thành phần máy chủ của bạn biết đó là máy khách của bạn gọi nó. Điều này có xu hướng được thực hiện khi cài đặt và sử dụng một cơ chế cụ thể của nền tảng để có được một id ứng dụng nào đó trong cuộc gọi đến máy chủ của bạn.

(Tôi là biên tập viên của thông số OAuth 2.0)


2
Bạn có thể giải thích về "cơ chế cụ thể của nền tảng để có được một id ứng dụng nào đó" không? Làm thế nào là thành phần máy chủ để xác minh danh tính của khách hàng? Tôi nghĩ rằng điều này có thể được thực hiện với việc cung cấp cho khách hàng. Ví dụ: triển khai chứng chỉ SSL mới và duy nhất cho mỗi khách hàng. Đó có phải là ý bạn không? Nếu nó phức tạp hơn thế này, có lẽ bạn có thể tham khảo một bài viết sâu hơn?
Cheeso

2
Tôi nhớ lại một số người bảo mật nói về cách điều này có thể được thực hiện. Có một cuộc gọi đến HĐH trả về mã thông báo đã ký mà sau đó bạn có thể gửi đến máy chủ của mình và xác minh. Xin lỗi tôi không có chi tiết cụ thể. Đó là một lỗi có thể sử dụng một số ví dụ tốt.
Dick Hardt

2
@DickHardt nhưng trong bối cảnh này, làm thế nào để bạn đảm bảo rằng ứng dụng di động thực sự là ứng dụng của bạn chứ không phải là một ứng dụng lừa đảo?
Rafael Membrive

11

Một giải pháp có thể là mã cứng bí mật OAuth vào mã, nhưng không phải là một chuỗi đơn giản. Làm xáo trộn nó theo một cách nào đó - chia nó thành các phân đoạn, dịch chuyển các ký tự bằng cách bù, xoay nó - thực hiện bất kỳ hoặc tất cả những điều này. Một cracker có thể phân tích mã byte của bạn và tìm các chuỗi, nhưng mã obfuscation có thể khó tìm ra.

Đó không phải là một giải pháp hoàn hảo, mà là một giải pháp rẻ tiền.

Tùy thuộc vào giá trị khai thác, một số cracker thiên tài có thể đi đến độ dài lớn hơn để tìm mã bí mật của bạn. Bạn cần cân nhắc các yếu tố - chi phí cho giải pháp phía máy chủ được đề cập trước đó, khuyến khích các cracker dành nhiều nỗ lực hơn trong việc tìm kiếm mã bí mật của bạn và mức độ phức tạp của obfuscation mà bạn có thể thực hiện.


1
Có tôi nghĩ rằng điều này là hợp lý. Sẽ cần rất nhiều quyết tâm để ai đó trích xuất bí mật người tiêu dùng và sau đó lấy thông tin đăng nhập của mọi người để làm điều gì đó có ý nghĩa. Đối với các ứng dụng cấu hình cao, tôi không chắc điều này là đủ, nhưng đối với một ứng dụng trung bình tôi nghĩ bạn đúng rằng bạn phải cân bằng thời gian thực hiện trước một mối đe dọa bảo mật nhỏ.
Felixyz

7
Tất cả chỉ cần cho một người dùng nỗ lực và sau đó xuất bản hoặc chia sẻ bí mật của bạn. Khi bí mật của bạn bị loại bỏ, nguy cơ dịch vụ của bạn bị đóng cửa hoàn toàn vì lạm dụng skyrockets và nó hoàn toàn nằm ngoài tầm kiểm soát của bạn.
quasistoic

8
Obfuscation không an toàn chút nào. Điều này còn tệ hơn cả không có bảo mật, bởi vì nó mang lại cho nhà phát triển cảm giác an toàn sai lầm. vi.wikipedia.org/wiki/Security_ENC_obscurity
Paul Legato

8
"Obfuscation hoàn toàn không phải là bảo mật. Điều này còn tệ hơn cả không có bảo mật nào cả, bởi vì nó mang lại cho nhà phát triển cảm giác an toàn sai lầm." Vô lý. Không ai nói rằng obfuscation làm cho an ninh tốt. Nhưng nếu tôi sẽ phân phối một bí mật OAuth với apk của mình, chắc chắn sẽ tốt hơn để che giấu hơn là không. Obfuscation là những gì Google cũng khuyến nghị khi lưu trữ khóa / bí mật trong ứng dụng. Nếu không có gì khác, các biện pháp này giữ cho các tin tặc bình thường ở lại, tốt hơn là không có gì. Báo cáo chăn như của bạn đánh đồng bảo mật không hoàn hảo không có bảo mật. Điều đó đơn giản là không đúng sự thật. Không hoàn hảo chỉ là không hoàn hảo.
đói

1
Obfuscation KHÔNG giúp được gì, vì cho dù bạn có dịch chuyển hay mã hóa bao nhiêu đi chăng nữa, bạn vẫn xây dựng khóa cùng nhau và sử dụng khóa đó để xây dựng yêu cầu API của bạn. Khá đơn giản để tự động móc API ở đúng nơi để loại bỏ yêu cầu bạn gửi trước cả mã hóa HTTPS. Vì vậy, xin vui lòng, không nhúng các khóa bí mật trong ứng dụng của bạn trừ khi thực sự không có khả năng thay thế.
C0deH4cker

6

Không lưu trữ bí mật bên trong ứng dụng.

Bạn cần phải có một máy chủ có thể được ứng dụng truy cập qua https (rõ ràng) và bạn lưu trữ bí mật trên đó.

Khi ai đó muốn đăng nhập thông qua ứng dụng di động / máy tính để bàn của bạn, ứng dụng của bạn sẽ chỉ cần chuyển tiếp yêu cầu đến máy chủ sau đó sẽ nối thêm bí mật và gửi cho nhà cung cấp dịch vụ. Máy chủ của bạn sau đó có thể cho ứng dụng của bạn biết nó đã thành công hay chưa.

Sau đó, nếu bạn cần nhận bất kỳ thông tin nhạy cảm nào từ dịch vụ (facebook, google, twitter, v.v.), ứng dụng sẽ yêu cầu máy chủ của bạn và máy chủ của bạn sẽ cung cấp cho ứng dụng chỉ khi nó được kết nối chính xác.

Thực sự không có bất kỳ tùy chọn nào ngoại trừ việc lưu trữ nó trên máy chủ. Không có gì ở phía khách hàng là an toàn.

Ghi chú

Điều đó nói rằng, điều này sẽ chỉ bảo vệ bạn chống lại khách hàng độc hại chứ không phải khách hàng chống lại bạn độc hại và không phải khách hàng chống lại các khách hàng độc hại khác (lừa đảo) ...

OAuth là một giao thức tốt hơn nhiều trong trình duyệt so với trên máy tính để bàn / thiết bị di động.


1
Điều này không làm cho cuộc sống của tin tặc dễ dàng hơn sao?! bởi vì bây giờ, để truy cập tài nguyên máy chủ, về mặt kỹ thuật, chúng tôi cần có id máy khách, vì dù sao máy chủ sẽ nối thêm bí mật vào yêu cầu. tui bỏ lỡ điều gì vậy?
Hudi Ilfeld

@HudiIlfeld Có bạn đang thiếu một cái gì đó: khách hàng cần phải đăng nhập vào máy chủ. Chừng nào anh ta không đăng nhập, máy chủ sẽ không trả lại bất cứ thứ gì. Một cách để quản lý điều này là sau khi gửi thông tin xác thực lần đầu tiên, máy chủ trả lại mã thông báo truy cập cho khách hàng và sau đó khách hàng gửi mã thông báo truy cập này với mọi yêu cầu trong tương lai. Có nhiều lựa chọn ở đây.
Gudradain

4

Có một phần mở rộng mới cho Loại Cấp phép Mã ủy quyền được gọi là Khóa chứng minh cho trao đổi mã (PKCE) . Với nó, bạn không cần một bí mật khách hàng.

PKCE (RFC 7636) là một kỹ thuật để bảo mật các máy khách công cộng không sử dụng bí mật của máy khách.

Nó chủ yếu được sử dụng bởi các ứng dụng gốc và di động, nhưng kỹ thuật này cũng có thể được áp dụng cho bất kỳ khách hàng nào. Nó yêu cầu hỗ trợ bổ sung bởi máy chủ ủy quyền, vì vậy nó chỉ được hỗ trợ trên một số nhà cung cấp nhất định.

từ https://oauth.net/2/pkce/

Để biết thêm thông tin, bạn có thể đọc RFC 7636 đầy đủ hoặc phần giới thiệu ngắn này .


2

Đây là một cái gì đó để suy nghĩ. Google cung cấp hai phương pháp OAuth ... cho các ứng dụng web, nơi bạn đăng ký tên miền và tạo một khóa duy nhất và cho các ứng dụng đã cài đặt nơi bạn sử dụng khóa "ẩn danh".

Có thể tôi đã xem qua một cái gì đó trong bài đọc, nhưng dường như việc chia sẻ khóa duy nhất của ứng dụng web của bạn với một ứng dụng đã cài đặt có thể an toàn hơn so với sử dụng "ẩn danh" trong phương thức ứng dụng được cài đặt chính thức.


2

Với OAuth 2.0, bạn chỉ cần sử dụng luồng phía máy khách để lấy mã thông báo truy cập và sử dụng mã thông báo truy cập này để xác thực tất cả các yêu cầu tiếp theo. Sau đó, bạn không cần một bí mật nào cả.

Một mô tả hay về cách thực hiện điều này có thể được tìm thấy ở đây: https://aaronparecki.com/articles/2012/07/29/1/oauth2-simplified#mobile-apps


Cung cấp dịch vụ hỗ trợ "dòng chảy phía khách hàng". Thay vào đó, nhiều người không yêu cầu ID khách hàng và bí mật của khách hàng để có được mã thông báo truy cập này.
Damian Yerrick

0

Tôi không có nhiều kinh nghiệm với OAuth - nhưng không phải mọi yêu cầu đều yêu cầu không chỉ mã thông báo truy cập của người dùng, mà còn cả khóa và bí mật của người tiêu dùng ứng dụng? Vì vậy, ngay cả khi ai đó đánh cắp thiết bị di động và cố gắng lấy dữ liệu ra khỏi thiết bị, họ sẽ cần một khóa ứng dụng và bí mật để có thể thực sự làm bất cứ điều gì.

Tôi luôn nghĩ rằng ý định đằng sau OAuth là để mọi Tom, Dick và Harry có bản mashup không phải lưu trữ thông tin đăng nhập Twitter của bạn một cách rõ ràng. Tôi nghĩ rằng nó giải quyết vấn đề đó khá tốt mặc dù có những hạn chế. Ngoài ra, nó không thực sự được thiết kế dành cho iPhone.


Bạn nói đúng, OAuth chủ yếu được thiết kế với các ứng dụng web và tôi chắc chắn rằng nó hoạt động tốt cho điều đó. Có, bạn cần mã thông báo và bí mật của người tiêu dùng để ký từng yêu cầu và vấn đề là nơi lưu trữ bí mật. Nếu ai đó đánh cắp khóa truy cập thì đó không phải là vấn đề lớn vì nó có thể bị thu hồi, nhưng nếu ai đó lấy khóa tiêu dùng thì mọi bản sao của ứng dụng của bạn đã bị xâm phạm.
Felixyz

OAuth 1 yêu cầu ký mỗi yêu cầu. OAuth 2 chỉ yêu cầu mã thông báo truy cập. Cả hai đều yêu cầu chìa khóa và bí mật khi có được mã thông báo.
Dick Hardt

0

Tôi đồng ý với Felixyz. OAuth mặc dù tốt hơn Basic Auth, vẫn còn một chặng đường dài để trở thành một giải pháp tốt cho các ứng dụng di động. Tôi đã chơi với OAuth để xác thực ứng dụng điện thoại di động với ứng dụng Google App Engine. Việc bạn không thể quản lý bí mật người tiêu dùng trên thiết bị di động một cách đáng tin cậy có nghĩa là mặc định là sử dụng quyền truy cập 'ẩn danh'.

Bước ủy quyền trình duyệt OAuth của Google App Engine sẽ đưa bạn đến một trang có chứa văn bản như: "Trang web <some-site> đang yêu cầu quyền truy cập vào Tài khoản Google của bạn cho (các) sản phẩm được liệt kê bên dưới"

YourApp (yourapp.appspot.com) - không liên kết với Google

Vân vân

Nó lấy <some-site> từ tên miền / tên máy chủ được sử dụng trong url gọi lại mà bạn cung cấp có thể là bất cứ thứ gì trên Android nếu bạn sử dụng lược đồ tùy chỉnh để chặn cuộc gọi lại. Vì vậy, nếu bạn sử dụng quyền truy cập 'ẩn danh' hoặc bí mật người tiêu dùng của bạn bị xâm phạm, thì bất kỳ ai cũng có thể viết một người tiêu dùng đánh lừa người dùng để cấp quyền truy cập vào ứng dụng gae của bạn.

Trang ủy quyền OAuth của Google cũng chứa nhiều cảnh báo có 3 mức độ nghiêm trọng tùy thuộc vào việc bạn đang sử dụng 'ẩn danh', bí mật người tiêu dùng hay khóa công khai.

Những thứ khá đáng sợ cho người dùng trung bình không am hiểu về kỹ thuật. Tôi không hy vọng sẽ có tỷ lệ hoàn thành đăng ký cao với loại công cụ đó.

Bài đăng trên blog này làm rõ cách thức bí mật của người tiêu dùng không thực sự hoạt động với các ứng dụng đã cài đặt. http://hueniverse.com/2009/02/should-twitter-discContue-their-basic-auth-api/


0

Tôi cũng đang cố gắng đưa ra giải pháp xác thực OAuth trên thiết bị di động và lưu trữ bí mật trong gói ứng dụng nói chung.

Và một ý tưởng điên rồ đã đánh vào tôi: Ý tưởng đơn giản nhất là lưu trữ bí mật bên trong nhị phân, nhưng bị che khuất bằng cách nào đó, hay nói cách khác, bạn lưu trữ một bí mật được mã hóa. Vì vậy, điều đó có nghĩa là bạn phải lưu trữ một khóa để giải mã bí mật của mình, điều này dường như đã đưa chúng ta vào vòng tròn đầy đủ. Tuy nhiên, tại sao không chỉ sử dụng một khóa đã có trong HĐH, tức là nó được xác định bởi HĐH chứ không phải bởi ứng dụng của bạn.

Vì vậy, để làm rõ ý tưởng của tôi là bạn chọn một chuỗi được xác định bởi HĐH, nó không thành vấn đề. Sau đó, mã hóa bí mật của bạn bằng cách sử dụng chuỗi này làm khóa và lưu trữ trong ứng dụng của bạn. Sau đó, trong thời gian chạy, giải mã biến bằng khóa, đây chỉ là hằng số HĐH. Bất kỳ hacker nào nhìn trộm vào nhị phân của bạn sẽ thấy một chuỗi được mã hóa, nhưng không có khóa.

Công việc vừa ý?


3
Suy nghĩ tốt, nhưng không. Người bẻ khóa sẽ chỉ nhìn thấy nhị phân trỏ đến địa chỉ của hằng số HĐH.
GrayB


0

Facebook không thực hiện OAuth một cách nghiêm túc (nhưng), nhưng họ đã thực hiện một cách để bạn không nhúng bí mật của mình vào ứng dụng iPhone của mình: https://web.archive.org/web/20091223092924/http://wiki. developers.facebook.com/index.php/Session_Proxy

Đối với OAuth, yeah, tôi càng nghĩ về nó, chúng tôi có một chút nhồi nhét. Có lẽ điều này sẽ khắc phục nó.


1
wiki.developers.facebook.com đã chết.
Hugo

0

Không có giải pháp nào trong số này ngăn chặn tin tặc xác định đánh hơi các gói được gửi từ thiết bị di động (hoặc trình giả lập) của chúng để xem bí mật của máy khách trong các tiêu đề http.

Một giải pháp có thể là có một bí mật động được tạo thành từ dấu thời gian được mã hóa bằng khóa & thuật toán mã hóa 2 chiều riêng tư. Sau đó, dịch vụ sẽ giải mã bí mật và xác định xem dấu thời gian là +/- 5 phút.

Bằng cách này, ngay cả khi bí mật bị xâm phạm, tin tặc sẽ chỉ có thể sử dụng nó trong tối đa 5 phút.


-2

Như những người khác đã đề cập, sẽ không có vấn đề thực sự với việc lưu trữ bí mật cục bộ trên thiết bị.

Trên hết, bạn luôn có thể dựa vào mô hình bảo mật dựa trên UNIX của Android: chỉ ứng dụng của bạn mới có thể truy cập vào những gì bạn ghi vào hệ thống tệp. Chỉ cần viết thông tin vào đối tượng SharedPreferences mặc định của ứng dụng của bạn.

Để có được bí mật, người ta sẽ phải có quyền truy cập root vào điện thoại Android.


3
Như ai đã đề cập? Nếu bạn muốn nói bình luận của poke, hãy xem câu trả lời của tôi bí mật đó! = Khóa xác thực. Cái sau có thể được lưu trữ một cách an toàn, cái trước không thể. Tôi không biết về Android, nhưng việc truy cập root vào iPhone không hề khó chút nào. Lưu ý rằng bí mật là giống nhau trên tất cả các phiên bản của ứng dụng, vì vậy kẻ tấn công sẽ chỉ phải có quyền truy cập vào một nhị phân. Và ngay cả khi họ không thể có quyền truy cập root trên thiết bị, họ vẫn có thể chạm tay vào nhị phân ở một số khác và rút mã thông báo bí mật ra khỏi thiết bị.
Felixyz

1
chỉ cần thêm nó là rất dễ dàng để root điện thoại Android
kgutteridge
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.