Можно ли удаленно разместить ресурс, используемый в приложении Android, таким образом, чтобы он мог использоваться только моим приложением?
По сути, я пытаюсь достичь размещения файла CSV, который будет извлекаться и использоваться моим приложением в качестве источника данных для заполнения некоторых таблиц. CSV будет обновляться с использованием последних данных, и я предполагаю, что приложение будет очень часто получать последнюю версию, чтобы гарантировать актуальность данных в нем.
Мой вопрос заключается в том, возможно ли гарантировать, что этот удаленный ресурс CSV используется только моим приложением?
Предположительно, если бы я только что получил URL-адрес плана для определения местоположения CSV, его можно было бы прослушать и путь, используемый другими. Я не понимаю, как я могу ограничить доступ к нему, так как пользователи могут использовать приложение практически из любого соединения.
Если я использую какое-то шифрование для файла, будут ли открыты ключи дешифрования, если кто-то декомпилирует файл apk java?
Существуют ли другие способы гарантировать, что мой источник данных csv используется только моим приложением?
Спасибо
(Я использую CSV, потому что данные не очень сложны и не требуют базы данных, я немного прочитал о подходе App->webservice->database к этой проблеме при использовании базы данных)
5 ответов
Вопрос, который вы задаете, должен звучать так: насколько я могу заставить крекеров жить? Если вы распространяете свое приложение через PlayStore, взгляните на этот вопрос, даже если он помечен не по теме, ответы и ссылки полезны.
я предполагаю, что ваше приложение не является бесплатным (так как.csv кажется ценным), так что более подробно изучите библиотеку Licensing Verification Library и этот пост, esp. Техника частей : Перенос проверки лицензии на доверенный сервер и Техника: Сделайте ваше приложение защищенным от несанкционированного доступа.
Короче говоря, и насколько я понимаю, вы идете следующим образом:
- загрузите ваш APK в Google с вашим открытым ключом RSA.
- реализовать запрос LVL внутри вашего приложения (без шифрования и без закрытого ключа внутри пакета приложения!**
- переслать ответ lvl на ваш сервер с постом через защищенное соединение SSL
- на вашем доверенном сервере, используя свой закрытый ключ RSA, вы должны проверить вещи, упомянутые в посте, особенно. поместите запрошенные идентификаторы пользователей в базу данных и посчитайте запросы от одного UID, если он намного выше среднего, вы можете предположить, что этот идентификатор пользователя использовался для недопустимых запросов.
- не отвечайте, если что-то пошло не так с чеком
- если все в порядке, ответьте с вашим CSV. сохраняйте свои данные только на клиенте Android, если вы хотите, чтобы пользователь использовал csv без подключения, иначе любое рутированное устройство или взломанный apk могли бы получить доступ и перераспределить csv - лучше: отправлять только запрошенные части (например, строки) csv в Пользователь
см. этот вопрос и атаки с повторным поиском и способы его предотвращения, чтобы никто не мог повторить вызов, предоставивший CSV или его части (например, порядковые номера на UID).
запутайте ваш код настолько хорошо, насколько это возможно, чтобы сделать работу еще сложнее, как уже упоминалось @VinceFR.
Есть еще некоторые атаки, такие как эти два:
- root устройство и проверить сохраненный CSV, а затем распространять - поэтому вы не хотите хранить CSV на клиенте
- перепроектируйте ваше приложение, зарегистрируйте, как мы надеемся, полный CSV, который они получили, и используйте его, вероятно, удалите код LVL, чтобы использовать ваше приложение бесплатно - вот почему вам все еще нужно запутывать и отправлять только запрошенные части
даже контрольную сумму, используя PackageManager
, apk подпись и т. д. pp не сделает это на 100%.
но на самом деле, пока клиент сначала не загрузит CSV (или любые другие данные), ваши данные будут сохранены. это даже экономия, пока вы можете доверять своим пользователям (например, ограниченный круг доверия для внутреннего приложения или чего-то еще, тогда вы должны предпочесть опции androids vpn для доступа к файлу). после этого, это просто вопрос времени и усилий, чтобы потратить взлом на ваше приложение и получить ценный CSV - и вопрос в том, стоит ли кому-то тратить это время на это.
дополнительная ссылка с дополнительной информацией и ссылками на LVL от Джастина Кейса.
хорошо прочитайте все эти ссылки и помните: создание достаточно трудного, чтобы сделать его бесценным, не может помешать взломщикам, которые ценят успех, - я имею в виду, что взломать какое-то "защищенное от взлома" программное обеспечение более ценным, даже без оплаты или чего-то, для каких-то людей.
PS: посмотрите этот ответ на другой вопрос, для "защищенного от взлома" программного обеспечения - но даже веб-сайт и его данные могут постоянно дублироваться, если оно того стоит.
В дополнение ко всем остальным ответам здесь есть запись в блоге разработчика Android под названием "Проверка внутренних вызовов из приложений Android", которая также должна быть вам интересна, на случай, если вы еще не столкнулись с ней.
Нет, это невозможно.
Как вы и подозревали, ваше приложение всегда можно проанализировать, чтобы узнать, как получить ресурс.
Если вы используете самодельное шифрование (основанное на известных типах шифрования), другие приложения могут читать ваш CSV-файл, но ваше приложение будет единственным, кто его обойдёт. Чтобы повысить сложность обратного инжиниринга вашего кода шифрования, вы можете создать шифратор, который смешивает Java
а также C
(использование JNI
) и, конечно же, не забудьте использовать proguard или другой обфускатор.
Как уже упоминалось, если ваше приложение может получить доступ к данным, то с некоторыми усилиями третьи стороны также могут получить к нему доступ.
Однако низкотехнологичное решение может просто установить http referer для вашего приложения и проверить его на вашем сервере.
Это только защитит ленивых неавторизованных пользователей, но в некоторых случаях соотношение отдачи / усилия может быть достаточно хорошим.