Секреты OAuth в мобильных приложениях



при использовании протокола OAuth вам нужна секретная строка, полученная из службы, которую вы хотите делегировать. Если вы делаете это в веб-приложении, вы можете просто хранить секрет в своей базе данных или в файловой системе, но как лучше всего обрабатывать его в мобильном приложении (или настольном приложении, если на то пошло)?



хранение строки в приложении, очевидно, не очень хорошо, так как кто-то может легко найти его и злоупотреблять им.



другой подход будет хранить его на вашем сервер, и приложение получает его при каждом запуске, никогда не сохраняя его на телефоне. Это почти так же плохо, потому что вы должны указать URL-адрес в приложении.



единственное работоспособное решение, которое я могу придумать, - это сначала получить маркер доступа как обычно (предпочтительно с помощью веб-представления внутри приложения), а затем направить всю дальнейшую связь через наш сервер, который добавит секрет к данным запроса и свяжется с поставщиком. С другой стороны, я нуб безопасности, так что я действительно хотелось бы услышать мнение некоторых знающих людей по этому поводу. Мне не кажется, что большинство приложений идут на эти длины, чтобы гарантировать безопасность (например, Facebook Connect, похоже, предполагает, что вы помещаете секрет в строку прямо в своем приложении).



другое дело: я не верю, что секрет связан с первоначальным запросом маркера доступа, так что это можно сделать без участия нашего собственного сервера. Я прав?

737   13  

13 ответов:

Да, это проблема с дизайном OAuth, с которой мы сталкиваемся сами. Мы решили прокси все звонки через наш собственный сервер. OAuth не был полностью смыт в отношении настольных приложений. Там нет префекта решение проблемы, которую я нашел без изменения OAuth.

Если вы думаете об этом и задаете вопрос, почему у нас есть секреты, в основном для обеспечения и отключения приложений. Если наш секрет скомпрометирован, то поставщик может только действительно отозвать все приложение. С мы должны встроить наш секрет в настольное приложение, мы вроде как облажались.

решение есть другой секрет для каждого приложения. OAuth не делает эту концепцию легкой. Один из способов - заставить пользователя пойти и создать секрет самостоятельно и ввести ключ самостоятельно в свое настольное приложение (некоторые приложения facebook долгое время делали что-то подобное, заставляя пользователя идти и создавать facebook, чтобы настроить свои пользовательские викторины и дерьмо). Это не большой опыт для пользователя.

Я работаю над предложением по системе делегирования для OAuth. Концепция заключается в том, что, используя наш собственный секретный ключ, который мы получаем от нашего поставщика, мы можем выдать наш собственный делегированный секрет нашим собственным настольным клиентам (по одному для каждого настольного приложения в основном), а затем во время процесса аутентификации мы отправляем этот ключ поставщику верхнего уровня, который перезванивает нам и повторно проверяет с нами. Таким образом, мы можем отозвать свои секреты, которые мы выдаем каждому настольному клиенту. (Заимствуя много того, как это работает с SSL). Вся эта система будет префектом для веб-сервисов с добавленной стоимостью, а также для передачи вызовов стороннему веб-сервису.

процесс также может быть выполнен без обратных вызовов проверки делегирования, если поставщик верхнего уровня предоставляет API для создания и отзыва новых делегированных секретов. Facebook делает что-то подобное, позволяя приложениям facebook разрешать пользователям создавать суб-приложения.

есть некоторые разговоры о проблеме онлайн:

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

решение Twitter и Yammer - это решение для аутентификации pin-кода: https://dev.twitter.com/oauth/pin-based https://www.yammer.com/api_oauth_security_addendum.html

с OAUth 2.0, вы можете хранить секрет на сервере. Используйте сервер для получения маркера доступа, который затем перемещается в приложение, и вы можете совершать вызовы из приложения на ресурс напрямую.

с помощью OAuth 1.0 (Twitter) секрет требуется для выполнения вызовов API. Проксирование вызовов через сервер является единственным способом убедиться, что секрет не скомпрометирован.

оба требуют некоторого механизма, который ваш серверный компонент знает, что это ваш клиент, вызывающий его. Это имеет тенденцию быть сделано на установке и с помощью платформы конкретного механизма, чтобы получить идентификатор приложения какой-то в вызове на ваш сервер.

(Я-редактор спецификации OAuth 2.0)

одним из решений может быть жесткий код секрет OAuth в код, но не как обычная строка. Запутайте его каким - то образом-разбейте его на сегменты, сдвиньте символы на смещение, поверните его-сделайте все или все эти вещи. Взломщик может проанализировать ваш байтовый код и найти строки, но код обфускации может быть трудно понять.

Это не надежное решение,но дешевое.

в зависимости от ценности эксплойта, некоторые гениальные крекеры может пойти на большее, чтобы найти свой секретный код. Вам нужно взвесить факторы-стоимость ранее упомянутого серверного решения, стимул для взломщиков тратить больше усилий на поиск вашего секретного кода и сложность обфускации, которую вы можете реализовать.

Не храните секрет внутри приложения.

вы должны иметь сервер, который может быть доступен приложением через https (очевидно) и вы храните Секрет на нем.

когда кто-то хочет войти в систему с помощью вашего мобильного/настольного приложения, ваше приложение просто перенаправит запрос на сервер, который затем добавит секрет и отправит его поставщику услуг. Затем ваш сервер может сообщить вашему приложению, было ли это успешно или нет.

затем, если вам нужно получить какую-либо конфиденциальную информацию из службы (facebook, google, twitter и т. д.), приложение попросит ваш сервер, и ваш сервер передаст его приложению только в том случае, если он правильно подключен.

на самом деле нет никакого варианта, кроме хранения его на сервере. Ничто на стороне клиента не является безопасным.

Примечание

тем не менее, это только защитит вас от вредоносного клиента, но не клиент против вредоносных вас, а не клиент против других вредоносных клиентов (phising)...

OAuth-это гораздо лучший протокол в браузере, чем на рабочем столе / мобильном устройстве.

здесь есть о чем подумать. Google предлагает два метода OAuth... для веб-приложений, где вы регистрируете домен и генерируете уникальный ключ, и для установленных приложений, где вы используете Ключ "анонимный".

возможно, я что-то пропустил в чтении, но кажется, что совместное использование уникального ключа вашего веб-приложения с установленным приложением, вероятно, более безопасно, чем использование "анонимного" в официальном методе установленных приложений.

с OAuth 2.0 вы можете просто использовать поток на стороне клиента для получения маркера доступа и использовать этот маркер доступа для аутентификации всех дальнейших запросов. Тогда тебе вообще не нужен секрет.

хорошее описание того, как это реализовать можно найти здесь:https://aaronparecki.com/articles/2012/07/29/1/oauth2-simplified#mobile-apps

У меня нет большого опыта работы с OAuth - но разве каждый запрос не требует не только токена доступа пользователя, но и ключа и секрета потребителя приложения? Таким образом, даже если кто-то украдет мобильное устройство и попытается вытащить из него данные, им понадобится ключ приложения и секрет, чтобы иметь возможность действительно что-либо делать.

Я всегда думал, что намерение OAuth было так, что каждый Том, Дик и Гарри, у которого был мэшап, не должен был хранить ваш Twitter верительные грамоты в чистом виде. Я думаю, что это решает эту проблему довольно хорошо, несмотря на его ограничения. Кроме того, он не был действительно разработан с учетом iPhone.

Я согласен с Феликсом. OAuth в то время как лучше, чем Basic Auth, все еще имеет долгий путь, чтобы быть хорошим решением для мобильных приложений. Я играл с использованием OAuth для аутентификации приложения мобильного телефона в приложении Google App Engine. Тот факт, что вы не можете надежно управлять секретом потребителя на мобильном устройстве, означает, что по умолчанию используется "анонимный" доступ.

шаг авторизации браузера в Google App Engine OAuth приведет вас на страницу, где он содержит текст типа: "Сайт запрашивает доступ к вашей учетной записи Google для продуктов, перечисленных ниже"

YourApp(yourapp.appspot.com) - не связан с Google

etc

Он принимает от имени домена/хоста, используемого в url обратного вызова, который вы предоставляете, который может быть чем угодно на Android, если вы используете пользовательскую схему для перехвата обратного вызова. Поэтому, если вы используете "анонимный" доступ или ваш потребительский секрет скомпрометирован, то любой может написать потребитель, который обманывает пользователя в предоставлении доступа к вашему приложению gae.

страница авторизации Google OAuth также содержит множество предупреждений, которые имеют 3 уровня серьезности в зависимости от того, используете ли вы "анонимный", потребительский секрет или открытые ключи.

довольно страшные вещи для среднего пользователя, который технически не подкован. Я не ожидаю, что у меня будет высокий процент завершения регистрации с такими вещами на пути.

Это сообщение в блоге уточняет, как consumer secret на самом деле не работает с установленными приложениями. http://hueniverse.com/2009/02/should-twitter-discontinue-their-basic-auth-api/

Я также пытаюсь придумать решение для мобильной аутентификации OAuth и хранения секретов в пакете приложений в целом.

и мне пришла в голову сумасшедшая идея: самая простая идея-хранить секрет внутри двоичного файла, но каким-то образом запутанный, или, другими словами, вы храните зашифрованный секрет. Итак, это означает, что вы должны хранить ключ для расшифровки вашего секрета, который, похоже, сделал нам полный круг. Однако, почему бы просто не использовать ключ, который уже есть в ОС, т. е. это определяется ОС, а не вашим приложением.

Итак, чтобы прояснить мою идею, вы выбираете строку, определенную ОС, не имеет значения, какая из них. Затем зашифруйте свой секрет, используя эту строку в качестве ключа, и сохраните ее в своем приложении. Затем во время выполнения расшифруйте переменную с помощью ключа, который является просто константой ОС. Любой хакер, заглядывающий в ваш двоичный файл, увидит зашифрованную строку, но не ключ.

будет работать?

здесь у меня есть ответ безопасный способ хранения информации oAuth в мобильном приложении

https://stackoverflow.com/a/17359809/998483

https://sites.google.com/site/greateindiaclub/mobil-apps/ios/securelystoringoauthkeysiniosapplication

Facebook не реализует OAuth строго говоря (пока), но они реализовали способ для вас не вставлять свой секрет в ваше приложение для iPhone: https://web.archive.org/web/20091223092924/http://wiki.developers.facebook.com/index.php/Session_Proxy

Что касается OAuth, да, чем больше я думаю об этом, мы немного набиты. Может быть этой исправим это.

существует новое расширение для типа предоставления кода авторизации под названием ключ доказательства для обмена кода (PKCE). С его помощью вам не нужен секрет клиента.

PKCE (RFC 7636) - это способ защиты публичных клиентов, которые не используют секрет клиента.

Он в основном используется родными и мобильными приложениями, но техника может применяется также к любому публичному клиенту. Это требует дополнительных поддержка сервером авторизации, так что это поддерживается только на некоторые провайдеры.

от https://oauth.net/2/pkce/

для получения дополнительной информации, вы можете прочитать полный RFC 7636 или это краткое введение.

Как уже упоминалось, не должно быть никакой реальной проблемы с хранением секретных локально на устройстве.

кроме того, вы всегда можете положиться на UNIX-модель безопасности Android: только ваше приложение может получить доступ к тому, что вы пишете в файловую систему. Просто запишите информацию в объект SharedPreferences вашего приложения по умолчанию.

чтобы получить секрет, нужно было бы получить корневой доступ к телефону Android.

Comments

    Ничего не найдено.