При использовании протокола OAuth вам нужна секретная строка, полученная от службы, которой вы хотите делегировать. Если вы делаете это в веб-приложении, вы можете просто сохранить секрет в своей базе данных или в файловой системе, но каков наилучший способ обработки его в мобильном приложении (или в этом случае в настольном приложении)?
Хранить строку в приложении явно нехорошо, так как кто-то может легко ее найти и злоупотребить ею.
Другой подход заключается в том, чтобы хранить его на вашем сервере, и приложение должно извлекать его при каждом запуске, никогда не сохраняя его на телефоне. Это почти так же плохо, потому что вы должны включить URL-адрес в приложении.
Единственное работоспособное решение, которое я могу придумать, - это сначала получить токен доступа в обычном режиме (желательно с использованием веб-представления внутри приложения), а затем направить всю дальнейшую связь через наш сервер, который добавит секрет к данным запроса и сообщит с провайдером. С другой стороны, я новичок в области безопасности, поэтому мне бы очень хотелось услышать мнение некоторых знающих людей по этому поводу. Мне не кажется, что большинство приложений идут на все, чтобы гарантировать безопасность (например, Facebook Connect, кажется, предполагает, что вы поместили секрет в строку прямо в своем приложении).
Другое дело: я не верю, что секрет заключается в первоначальном запросе токена доступа, так что это можно сделать без участия нашего собственного сервера. Я прав?
Ответы:
Да, это проблема дизайна 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 - это решение для аутентификации: 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 и т. Д.), Приложение запросит ваш сервер, и ваш сервер передаст ее приложению, только если оно правильно подключено.
На самом деле нет другого выбора, кроме как хранить его на сервере. Ничто на стороне клиента не является безопасным.
Заметка
Тем не менее, это защитит вас только от злонамеренного клиента, но не клиента от злонамеренного вас и не клиента от других вредоносных клиентов (фишинг) ...
OAuth - намного лучший протокол в браузере, чем на настольном / мобильном.
источник
Существует новое расширение типа предоставления кода авторизации, называемое ключом проверки для обмена кодами (PKCE) . С ним вам не нужен секрет клиента.
с https://oauth.net/2/pkce/
Для получения дополнительной информации вы можете прочитать полный RFC 7636 или это краткое введение .
источник
Вот о чем подумать. 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. Тот факт, что вы не можете надежно управлять секретом пользователя на мобильном устройстве, означает, что по умолчанию используется анонимный доступ.
На этапе авторизации браузера 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/
источник
Я также пытаюсь найти решение для проверки подлинности 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, да, чем больше я думаю об этом, мы немного напичканы. Возможно это исправит это.
источник
Ни одно из этих решений не препятствует определенному хакеру прослушивать пакеты, отправленные с их мобильного устройства (или эмулятора), чтобы просмотреть секрет клиента в заголовках http.
Одним из решений может быть наличие динамического секрета, который состоит из временной метки, зашифрованной с помощью частного ключа и алгоритма двустороннего шифрования. Затем служба расшифровывает секрет и определяет, является ли отметка времени +/- 5 минут.
Таким образом, даже если секрет будет раскрыт, хакер сможет использовать его не более 5 минут.
источник
Как уже упоминалось, не должно быть реальной проблемы с хранением секрета локально на устройстве.
Кроме того, вы всегда можете положиться на модель безопасности Android на основе UNIX: только ваше приложение может получить доступ к тому, что вы пишете в файловую систему. Просто запишите информацию в объект SharedPreferences вашего приложения по умолчанию.
Чтобы получить секрет, нужно получить root-доступ к телефону Android.
источник