Должен ли я запутывать секрет потребителя OAuth, хранящийся в приложении Android?

Мое приложение для Android содержит потребительский секрет OAuth для API Twitter. На данный момент он находится в .properties файле в виде обычного текста, поэтому поиск его в APK не требует никаких усилий.

Должен ли я предпринять шаги, чтобы скрыть его (например, rot13 или сохранить в запутанном коде Java)? Или мне действительно следует избегать всего этого, поскольку это создаст ложное чувство безопасности?

Как люди обычно распространяют/хранят секрет OAuth в приложениях для Android? Насколько часто секрет может быть украден и использован не по назначению?


person Pēteris Caune    schedule 19.08.2011    source источник
comment
У меня такая же стратегия с моим iOS-приложением и NodeJS+ExpressJS+PassportJS на бэкенде. Я использую обратную аутентификацию Twitter для аутентификации пользователей из iOS. Но чтобы защитить это и не дать пользователям перехватывать HTTP-пакеты в середине, чтобы узнать, что находится в заголовках, я планирую использовать HTTPS на своих серверах для шифрования данных. Установите этот флажок, чтобы избежать встраивания ваших секретных ключей в ваше приложение: dev.twitter.com/ docs/ios/использование обратной аутентификации   -  person Maziyar    schedule 24.05.2014
comment
Примечание. Обратная аутентификация доступна только для iOS.   -  person Steve Tauber    schedule 30.07.2014


Ответы (4)


Настоящий вопрос заключается в том, что злоумышленник получает от кражи...

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

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

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

Запутывание — один из вариантов, но слабый. Перемещение секрета на веб-сервер, выступающий в качестве прокси-сервера API, — это другое, но это просто перемещает проблему в другое место, потому что теперь ваше приложение должно проходить аутентификацию на прокси-сервере. Однако этот шаблон может быть достаточно безопасным, если вы требуете, чтобы пользователи входили на ваш сайт (который может использовать для входа через веб-просмотры Twitter). Таким образом, кому-то, кто попытается злоупотребить вашим прокси-сервером, потребуется, чтобы его пользователи открыли учетные записи в вашем сервисе, что не очень привлекательно.

Короче говоря, иди и запутывай его. Это не больно. Рассмотрите возможность использования шаблона прокси. И, возможно, пусть Twitter знает, что их политика безопасности «не очень хороша».

person Eran Hammer    schedule 20.08.2011
comment
Спасибо за ответ. Приложение, над которым я работаю, не будет популярным социальным приложением, твиты — это его побочная функция. Поэтому я думаю, что я пойду с некоторой запутанностью, но пропущу дополнительную сложность шаблона прокси. - person Pēteris Caune; 22.08.2011
comment
Приятно видеть, что мои доводы подкреплены кем-то знающим. Хотя проксирование действительно перемещает проблему в другое место, потенциальный хакер должен написать специальную программу для злоупотребления вашим прокси. На самом деле они просто будут собирать потребительские секреты из других приложений — вот в конце концов, существует более миллиона сторонних приложений. - person David Snabel-Caunt; 22.08.2011
comment
В приложениях Twitter есть URL-адрес обратного вызова. Будет ли этого достаточно, чтобы хакеры не создавали веб-приложения для кражи данных? Это должен быть домен, который вы установили в настройках своего приложения, иначе он не авторизует все, что вы отправляете. - person Maziyar; 24.05.2014
comment
@Eran Даже если секретный ключ был запутан с использованием сложного алгоритма, есть ли что-нибудь, что мешает кому-то установить сертификат на устройство, чтобы заставить его думать, что оно взаимодействует с API Twitter, поэтому оно отправляет деобфусцированный ключ вместе с запросом, когда в на самом деле он отправляет деобфусцированный ключ на сервер злоумышленника? И если да, то не является ли это упражнение с сертификатом довольно тривиальным, так какой смысл запутывать ключ? - person Josh Sherick; 31.07.2015
comment
Есть ли способ поместить его в связку ключей iOS/Android? - person Weishi Z; 12.08.2016

Я определенно прочитал бы этот анализ одного из Авторы OAuth, Эран Хаммер-Лахав, который цитирует другой статья, посвященная секретным проблемам OAuth в Twitter.

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

По мнению Hammer-Lahav, секреты OAuth не должны отзываться и должны использоваться только для сбора статистики. Надеюсь, Twitter последует этому совету.

person David Snabel-Caunt    schedule 19.08.2011
comment
В статье говорится не использовать клиентские секреты в установленных приложениях, а ваш совет делать наоборот... - person ; 19.08.2011
comment
@Graham Отличный момент - я должен был быть немного яснее. Если OP планирует продолжить, то важно обфускация. В противном случае, я думаю, вам нужна реализация, в которой секрет хранится на удаленном сервере, а веб-служба действует как прокси для вызовов OAuth. Я не знаю, каковы лучшие практики для этого подхода. - person David Snabel-Caunt; 19.08.2011

Чтобы скрыть секретные ключи OAuth в приложении для Android, вы можете использовать разработанный нами плагин Gradle. Это бесплатная альтернатива Dexguard с открытым исходным кодом. Наш плагин hidden-secrets-gradle использует операторы NDK и XOR для запутывания ключей, чтобы предотвратить обратное проектирование.

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

Доступ к плагину и все подробности: https://github.com/klaxit/hidden-secrets-gradle-plugin

person Ben-J    schedule 09.11.2020

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

person Konstantin Pribluda    schedule 19.08.2011
comment
Да, но если кто-то найдет потребительский секрет вашего приложения, он может притвориться вашим приложением. Вы можете изменить ключ и секрет, но тогда все ваши установки в поле больше не смогут твитить. - person funkybro; 20.08.2011
comment
Нет возможности скрыть что-то внутри вашего приложения от определенного человека (даже OS 360 была реконструирована и пропатчена машинным кодом в России). И даже если кто-то выдает себя за ваше приложение, пользователю все равно придется аутентифицировать себя в сервисе, так что никакого реального компромисса здесь нет. - person Konstantin Pribluda; 20.08.2011
comment
Я думаю, что этот ответ перепутал потребительские секреты с токенами oauth. - person David Snabel-Caunt; 22.08.2011