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

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

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

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

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

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

4b9b3361

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

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

Решение состоит в том, чтобы иметь отдельный секрет для каждого настольного приложения. OAuth не делает эту концепцию легкой. Один из способов заключается в том, чтобы пользователь пошел и создал секрет самостоятельно и самостоятельно ввел ключ в свое настольное приложение (некоторые приложения для 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 - это решение для проверки подлинности: https://dev.twitter.com/oauth/pin-based https://www.yammer.com/api_oauth_security_addendum.html

33
ответ дан 20 дек. '09 в 0:44
источник

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

С OAuth 1.0 (Twitter) секрет должен быть вызван API. Проксирование вызовов через сервер - единственный способ обеспечить, чтобы секрет не был скомпрометирован.

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

(Я являюсь редактором спецификации OAuth 2.0)

16
ответ дан 03 мая '14 в 18:07
источник

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

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

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

11
ответ дан 20 дек. '09 в 19:46
источник

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

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

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

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

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

Примечание

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

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

4
ответ дан 20 янв. '15 в 21:34
источник

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

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

2
ответ дан 12 июня '14 в 22:22
источник

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

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

2
ответ дан 03 апр. '10 в 3:57
источник

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

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

0
ответ дан 20 дек. '09 в 4:16
источник

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

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

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

Будет ли это работать?

0
ответ дан 19 янв. '11 в 19:35
источник

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

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

0
ответ дан 29 апр. '10 в 13:04
источник

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

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

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

и т.д.

Требуется < some-site > от имени домена/хоста, используемого в URL-адресе обратного вызова, который вы поставляете, который может быть любым на Android, если вы используете специальную схему для перехвата обратного вызова. Поэтому, если вы используете "анонимный" доступ, или ваш секрет потребителя скомпрометирован, тогда любой может написать потребителя, который обманывает пользователя в предоставлении доступа к вашему приложению gae.

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

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

В этом блоге разъясняется, как секретный секрет не работает с установленными приложениями. http://hueniverse.com/2009/02/should-twitter-discontinue-their-basic-auth-api/

0
ответ дан 16 сент. '10 в 20:31
источник

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

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

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

-1
ответ дан 20 дек. '09 в 3:03
источник