Sekrety OAuth w aplikacjach mobilnych

Podczas korzystania z protokołu OAuth, potrzebujesz tajnego ciągu uzyskanego z usługi, do której chcesz delegować. Jeśli robisz to w aplikacji internetowej, możesz po prostu przechowywać sekret w swojej bazie danych lub w systemie plików, ale jaki jest najlepszy sposób na obsługę go w aplikacji mobilnej (lub aplikacji komputerowej)?

Przechowywanie ciągu w aplikacji nie jest oczywiście dobre, ponieważ ktoś może łatwo go znaleźć i nadużywać.

Innym podejściem byłoby przechowywanie go na serwerze i mieć aplikacja pobiera go przy każdym uruchomieniu, nigdy nie przechowując go w telefonie. Jest to prawie tak samo złe, ponieważ musisz podać adres URL w aplikacji.

Jedynym wykonalnym rozwiązaniem, jakie mogę wymyślić, jest najpierw uzyskanie Tokena dostępu jak zwykle (najlepiej za pomocą widoku sieciowego wewnątrz aplikacji), a następnie przekierowanie całej dalszej komunikacji przez nasz serwer, który dołączyłby tajemnicę do danych żądania i komunikował się z dostawcą. Z drugiej strony, jestem noobem z ochrony, więc chciałbym usłyszeć kilka opinie ludzi znających się na tym. Nie wydaje mi się, że większość aplikacji dąży do tego, aby zagwarantować bezpieczeństwo (na przykład Facebook Connect wydaje się zakładać, że umieściłeś sekret w ciągu znaków bezpośrednio w aplikacji).

Inna sprawa: nie wierzę, że tajemnica jest związana z pierwotnym żądaniem Tokena dostępu, więc można to zrobić bez angażowania własnego serwera. Mam rację?

Author: Felixyz, 2009-12-20

13 answers

Tak, jest to problem z projektem OAuth, z którym sami się stajemy. Zdecydowaliśmy się na proxy wszystkich połączeń przez nasz własny serwer. OAuth nie został całkowicie wypłukany w odniesieniu do aplikacji desktopowych. Nie ma idealnego rozwiązania problemu, który znalazłem bez zmiany OAuth.

Jeśli pomyślisz o tym i zadasz pytanie, dlaczego mamy tajemnice, jest głównie do udostępniania i wyłączania aplikacji. Jeśli nasz sekret zostanie naruszony, dostawca może naprawdę odwołać całą aplikację. Ponieważ mamy aby osadzić nasz sekret w aplikacji komputerowej, mamy przerąbane.

Rozwiązaniem jest posiadanie innej tajemnicy dla każdej aplikacji komputerowej. OAuth nie ułatwia tego pomysłu. Facebook Facebook zrobił coś podobnego przez długi czas, mając użytkownika go i utworzyć facebook, aby skonfigurować swoje niestandardowe quizy i bzdura).w ten sposób, użytkownik może stworzyć swój własny sekret na własną rękę i wprowadzić klucz na własną rękę do aplikacji na pulpicie (niektóre aplikacje facebook zrobił coś podobnego przez długi czas, mając użytkownika go i utworzyć facebook, aby skonfigurować swoje niestandardowe quizy i bzdura). To nie jest wspaniałe doświadczenie dla użytkownika.

Pracuję nad propozycja systemu delegacji dla OAuth. Koncepcja polega na tym, że używając naszego własnego tajnego klucza, który otrzymujemy od naszego dostawcy, możemy wydać nasz własny delegowany sekret naszym własnym klientom stacjonarnym (po jednym dla każdej aplikacji komputerowej), a następnie podczas procesu auth wysyłamy ten klucz do dostawcy najwyższego poziomu, który oddzwania do nas i ponownie weryfikuje z nami. W ten sposób możemy odwołać własne tajemnice, które wydajemy każdemu klientowi komputerowemu. (Zapożyczając wiele z tego, jak to działa z SSL). Cały ten system byłby prefekt dla usług internetowych o wartości dodanej, które przekazują połączenia do usług internetowych stron trzecich.

Proces można również wykonać bez wywołań zwrotnych weryfikacji delegacji, jeśli dostawca najwyższego poziomu zapewnia API do generowania i odwoływania nowych przekazanych tajemnic. Facebook Facebook robi coś podobnego, pozwalając aplikacjom Facebooka, aby umożliwić użytkownikom tworzenie podaplikacji.

Są pewne rozmowy na temat online:

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

Rozwiązanie Twittera i Yammera To rozwiązanie uwierzytelniające pin: https://dev.twitter.com/oauth/pin-based https://www.yammer.com/api_oauth_security_addendum.html

 34
Author: Zac Bowling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-05 12:40:39

Dzięki OAUth 2.0 możesz przechowywać sekret na serwerze. Użyj serwera, aby uzyskać token dostępu, który następnie przenieść do aplikacji i można wykonywać połączenia z aplikacji do zasobu bezpośrednio.

Z OAuth 1.0 (Twitter), sekret jest wymagany do wykonywania połączeń API. Proxy połączeń przez serwer jest jedynym sposobem, aby upewnić się, że tajemnica nie jest zagrożona.

Oba wymagają jakiegoś mechanizmu, który twój komponent serwera wie, że to klient go wywołuje. Zwykle odbywa się to na instalacja i użycie specyficznego mechanizmu platformy, aby uzyskać jakiś identyfikator aplikacji w wywołaniu do serwera.

(jestem redaktorem specyfikacji OAuth 2.0)

 18
Author: Dick Hardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-03 15:07:09

Jednym z rozwiązań może być twarde zakodowanie tajemnicy OAuth do kodu, ale nie jako zwykły ciąg znaków. Zaciemniaj go w jakiś sposób-podziel na segmenty, przesuń znaki o przesunięcie, obróć-wykonaj dowolne lub wszystkie te rzeczy. Cracker może analizować twój kod bajtowy i znaleźć ciągi znaków, ale kod zaciemnienia może być trudny do zrozumienia.

To nie niezawodne rozwiązanie, ale tanie.

W zależności od wartości exploita, niektóre genialne krakersy mogą przejść do większej / align = "left" / Musisz rozważyć czynniki-koszt wcześniej wspomnianego rozwiązania po stronie serwera, zachętę dla crackerów do poświęcenia więcej wysiłku na znalezienie tajnego kodu i złożoność ukrywania, które możesz zaimplementować.

 10
Author: Jayesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-21 12:03:50

Nie przechowuj tajemnicy wewnątrz aplikacji.

Musisz mieć serwer, do którego aplikacja może uzyskać dostęp przez https (oczywiście) i przechowywać na nim sekret.

Jeśli ktoś chce zalogować się za pośrednictwem aplikacji mobilnej/desktopowej, aplikacja po prostu przekaże żądanie na serwer, który następnie doda sekret i wyśle go do dostawcy usług. Serwer może wtedy stwierdzić, czy aplikacja się powiodła lub nie.

Następnie, jeśli chcesz uzyskać poufne informacje z usługi (facebook, google, twitter, itp.), aplikacja Zapytaj serwer i serwer da go do aplikacji tylko wtedy, gdy jest prawidłowo podłączony.

Nie ma tak naprawdę żadnej opcji poza przechowywaniem go na serwerze. Nic po stronie klienta nie jest bezpieczne.

Uwaga

To powiedziawszy, ochroni cię tylko przed złośliwym klientem, ale nie przed złośliwym Tobą, a nie klientem przeciwko innym złośliwym klientom (phising)...

OAuth jest dużo lepszym protokołem w przeglądarce niż na komputerze / telefonie komórkowym.

 5
Author: Gudradain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-20 18:48:26

Tu jest coś do przemyślenia. Google oferuje dwie metody OAuth... dla aplikacji internetowych, w których rejestrujesz domenę i generujesz unikalny klucz, oraz dla zainstalowanych aplikacji, w których używasz klucza "anonimowy".

Może i glossed nad czymś w czytaniu, ale wydaje się, że dzielenie unikalny klucz webapp z zainstalowaną aplikacją jest prawdopodobnie bardziej bezpieczne niż za pomocą "anonimowy" w oficjalnej metodzie zainstalowanych aplikacji.

 2
Author: YiddishNinja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-03 00:57:59

Z OAuth 2.0 można po prostu użyć przepływu po stronie klienta, aby uzyskać token dostępu i użyć tego tokenu dostępu do uwierzytelniania wszystkich dalszych żądań. Więc w ogóle nie potrzebujesz sekretu.

Ładny opis jak to zaimplementować można znaleźć tutaj: https://aaronparecki.com/articles/2012/07/29/1/oauth2-simplified#mobile-apps

 2
Author: Joel Richard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-12 19:22:00

Nie mam dużego doświadczenia z OAuth - ale czy każde żądanie nie wymaga nie tylko tokena dostępu użytkownika, ale także klucza i tajemnicy aplikacji? Tak więc, nawet jeśli ktoś kradnie urządzenie mobilne i próbuje wyciągnąć z niego dane, będzie potrzebował klucza i tajemnicy aplikacji, aby móc właściwie cokolwiek zrobić.

Zawsze myślałem, że intencją OAuth było, aby każdy Tom, Dick i Harry, którzy mieli mashup, nie musieli przechowywać Twoich danych uwierzytelniających na Twitterze czysto. Myślę, że rozwiązuje ten problem całkiem dobrze, pomimo jego ograniczeń. Ponadto nie został zaprojektowany z myślą o iPhonie.

 0
Author: bpapa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-20 01:16:48

Zgadzam się z Felixyz. OAuth choć lepszy niż podstawowy Auth, wciąż ma długą drogę do bycia dobrym rozwiązaniem dla aplikacji mobilnych. Grałem za pomocą OAuth uwierzytelnić aplikację na telefon komórkowy do aplikacji Google App Engine. Fakt, że nie można niezawodnie zarządzać tajemnicą konsumenta na urządzeniu mobilnym oznacza, że domyślnie jest używany dostęp "anonimowy".

Krok autoryzacji przeglądarki Google App Engine OAuth przeniesie Cię do strony, na której znajduje się tekst jak: "Witryna prosi o dostęp do konta Google dla produktów wymienionych poniżej"

YourApp(yourapp.appspot.com) - nie związany z Google

Etc

Trwa z nazwy domeny / hosta używanego w adresie URL wywołania zwrotnego, który dostarczasz, który może być cokolwiek na Androida, jeśli używasz niestandardowego schematu przechwytywania wywołania zwrotnego. Więc jeśli korzystasz z dostępu "anonimowego" lub Twoja tajemnica konsumenta jest zagrożona, to każdy może napisać konsumenta, że głupcy użytkownika, aby dać dostęp do aplikacji gae.

Strona autoryzacji Google OAuth zawiera również wiele ostrzeżeń, które mają 3 poziomy nasilenia w zależności od tego, czy używasz "anonimowych", tajemnicy konsumenta lub kluczy publicznych.

Dość przerażające rzeczy dla przeciętnego użytkownika, który nie jest technicznie doświadczony. Nie spodziewam się wysokiego procentu ukończenia rejestracji z tego rodzaju rzeczami w drodze.

Ten wpis na blogu wyjaśnia, jak naprawdę nie działa consumer secret zainstalowane aplikacje. http://hueniverse.com/2009/02/should-twitter-discontinue-their-basic-auth-api/

 0
Author: Martin Bayly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-16 18:33:48

Staram się również wymyślić rozwiązanie do mobilnego uwierzytelniania OAuth i przechowywania tajemnic w pakiecie aplikacji w ogóle.

I wpadł mi do głowy szalony pomysł: najprostszym pomysłem jest przechowywanie tajemnicy wewnątrz binarnego, ale w jakiś sposób zaciemniony, lub innymi słowy, przechowujesz zaszyfrowany sekret. To oznacza, że musisz przechować klucz, by odszyfrować swój sekret, który zaprowadził nas do pełnego kręgu. Dlaczego jednak nie użyć klucza, który jest już w systemie operacyjnym, tzn. jest zdefiniowany przez system operacyjny, a nie przez Twoją aplikację.

Więc, aby wyjaśnić mój pomysł jest to, że wybrać ciąg zdefiniowany przez OS, nie ma znaczenia, który z nich. Następnie Zaszyfruj swój sekret za pomocą tego ciągu jako klucza i przechowuj go w aplikacji. Następnie podczas wykonywania odszyfruj zmienną za pomocą klucza, który jest tylko stałą systemu operacyjnego. Każdy haker zaglądający do Twojego pliku binarnego zobaczy zaszyfrowany ciąg, ale nie będzie klucza.

Czy to zadziała?

 0
Author: Daniel Thorpe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-19 16:35:23
 0
Author: Boobalan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:46:47

Facebook nie implementuje ściśle mówiąc OAuth (jeszcze), ale wdrożył sposób, aby nie osadzać swojego sekretu w aplikacji na iPhone ' a: https://web.archive.org/web/20091223092924/http://wiki.developers.facebook.com/index.php/Session_Proxy

Co do OAuth, tak, im więcej o tym myślę, tym jesteśmy trochę wypchani. Może to to naprawi.

 0
Author: oliland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-23 16:08:05

Istnieje nowe rozszerzenie typu autoryzacji kodu Grantu o nazwie Proof Key for Code Exchange (PKCE) . Dzięki temu nie potrzebujesz tajemnicy klienta.

PKCE (RFC 7636) jest techniką zabezpieczającą klientów publicznych, którzy nie używają sekret klienta.

Jest używany głównie przez aplikacje natywne i mobilne, ale technika może być stosowane do każdego klienta publicznego, jak również. Wymaga dodatkowych wsparcie przez serwer autoryzacji, więc jest obsługiwane tylko na pewne dostawcy.

od https://oauth.net/2/pkce/

Aby uzyskać więcej informacji, możesz przeczytać pełny RFC 7636 lub ten krótki wstęp.

 0
Author: Johannes Filter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-06 14:26:45

Jak już wspomnieli inni, nie powinno być problemu z przechowywaniem tajemnicy lokalnie na urządzeniu.

Poza tym zawsze możesz polegać na uniksowym modelu bezpieczeństwa Androida: tylko Twoja aplikacja może uzyskać dostęp do tego, co zapisujesz w systemie plików. Po prostu zapisz informacje do domyślnego obiektu SharedPreferences aplikacji.

Aby uzyskać tajemnicę, trzeba by uzyskać dostęp roota do telefonu z Androidem.

 -1
Author: Christopher Orr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-20 00:03:06