Обфускация активов в Android APK

Мы можем запутать Android APK, используя Proguard в Android Studio, который будет запутывать только java файлов в нем.

Проблема: я также хочу запутать свои файлы, хранящиеся в папке «Активы».

Решение: мы можем использовать Dexguard, для которого требуется лицензия и все такое.

Может ли кто-нибудь указать любую бесплатную альтернативу с открытым исходным кодом?


person AndiGeeky    schedule 27.10.2016    source источник
comment
Я только что нашел только серверное решение для хранения конфиденциальных данных.   -  person Vyacheslav    schedule 27.10.2016
comment
@Вячеслав: Можешь объяснить?   -  person AndiGeeky    schedule 27.10.2016
comment
Я имею в виду, что APK — это zip-архив. Вы отдаете его пользователю. Он может делать все, что угодно, с данными вашей программы. Proguard просто переводит данные в трудночитаемый код. Но даже этот код можно расшифровать в обычные java-файлы. Это невозможно скрыть вашу идею.   -  person Vyacheslav    schedule 27.10.2016
comment
Чтобы предотвратить обратный инжиниринг, вы можете заархивировать свои данные вручную и/или загрузить на сервер для будущего использования.   -  person Vyacheslav    schedule 27.10.2016
comment
Я думаю, вы можете зашифровать/расшифровать этот способ   -  person Pratik Butani    schedule 27.10.2016
comment
@Vyacheslav: Я так понимаю, шифрование данных поможет?   -  person AndiGeeky    schedule 27.10.2016
comment
@PratikButani, я так думаю.   -  person Vyacheslav    schedule 27.10.2016
comment
@AndiGeeky, если вы создадите чудо-ключ и спрячете его в приложении, которое вы можете использовать. Но вы должны где-то хранить этот ключ   -  person Vyacheslav    schedule 27.10.2016
comment
@AndiGeeky, в общем случае да. Но помните, никто не может гарантировать, что ваш код не будет виден в будущем.   -  person Vyacheslav    schedule 27.10.2016
comment
@Вячеслав: Спасибо :)   -  person AndiGeeky    schedule 27.10.2016
comment
@PratikButani: Спасибо :)   -  person AndiGeeky    schedule 27.10.2016


Ответы (2)


Короткий ответ. Лучшей альтернативой будет создание собственной системы шифрования.

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

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

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

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

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

person Ricardo Vieira    schedule 27.10.2016

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

Обфускация просто предотвращает доступ злоумышленников низкого уровня.


(ответ) Тем не менее, вы загружаете свои файлы ресурсов в Java самостоятельно?

Затем вы можете зашифровать их с помощью некоторого ключа, который будет жестко закодирован + обфусцирован внутри кода .java, поэтому только люди, способные разобрать файлы .dex и понять ваш ключ, смогут расшифровать ваши активы (или есть другой способ, взяв под контроль через виртуальную машину, на которой запущен ваш .apk, подождите, пока ваше приложение загрузит и расшифрует актив, и атакуйте их, сбросив его с виртуальной машины в расшифрованном виде, иногда это может быть проще, если код дешифрования действительно сложный и трудный для понимания).

Для любого приличного шифрования используйте стороннюю библиотеку (не стесняйтесь смешивать ее со своим собственным решением, но не ожидайте, что самостоятельно создадите какую-то надежную схему шифрования, для создания чего-либо достаточно надежного потребуются некоторые усилия), на самом деле java и Android по умолчанию имеет несколько поставщиков «безопасности» с реализованными общими надежными схемами шифрования.

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


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

person Ped7g    schedule 27.10.2016