Подтвердить что ты не робот

Проверка целостности активов Android

В моей папке assets/data есть много файлов XML, содержащих статические данные для моего приложения.

Пользователю очень легко получить APK, изменить его часть и установить на устройство.

Я хотел бы запретить пользователям изменять мои статические данные, проверяя целостность моей папки assets/data.

Первоначально я рассматривал возможность использования контрольной суммы MD5, но он, вероятно, будет слишком медленным для количества файлов, которые у меня будут (50-100).

Есть ли у вас какие-либо предложения?

Edit:

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

4b9b3361

Ответ 1

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

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

Вот какой дешевый и неприятный код для этого:

   PackageManager pm = context.getPackageManager();

   PackageInfo info = pm.getPackageInfo( context.getPackageName(), PackageManager.GET_SIGNATURES );

   if ( info.signatures[ 0 ].toCharsString().equals( YOUR_SIGNATURE ) )
   {
     //signature is OK
   }

где YOUR_SIGNATURE является константой, полученной при запуске этого кода в подписанном приложении.

Теперь есть две оставшиеся проблемы, о которых вы уже намекали:

  • как вы можете остановить кого-то, просто изменяя константу в исходном коде, чтобы соответствовать их сертификату, затем переупаковывать и повторно подписывать приложение?

  • как вы можете остановить кого-то, находящего метод проверки и удалив его?

Отвечайте на оба: вы не можете, не совсем, но вы можете сделать довольно хорошую работу путем обфускации. Бесплатный Proguard, но более полезный коммерческий Dexguard, - это инструменты для этого. Вы можете столкнуться с текущей стоимостью 350 евро; с другой стороны, я попытался перепроектировать приложения, которые защищены таким образом, и если ставки не были очень высокими, это не стоит проблем.

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

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

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

Ответ 2

Отклик ответа, хотя он отрицательный.

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

Ответ 3

Возможно, вы можете закрепить файлы xml и поместить их в папку активов/данных; а затем выполните контрольную сумму для этого .zip. При первом запуске вы можете разархивировать файлы для получения макетов .xml. См. Разархивировать файл из архива ZIP из нескольких файлов с использованием ZipFile класса для распаковки архива.

Ответ 4

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