Как зашифровать (защитить) исходный код приложения Android Cordova

Как вы, возможно, знаете, файл apk на самом деле является просто zip-архивом, поэтому вы можете попытаться переименовать (или просто заставить свой инструмент для распаковки открыть файл apk) файл в appname.apk.zip и извлеките его любой утилитой zip. В этом примере мы собираемся создать приложение, которое использует React (не реагирует нативно) и webpack для генерации всего кода js в одном файле. app.js, Затем мы создаем приложение, используя cordova build android --release и мы видим содержимое сгенерированного apk файла (сборка или отладка) в project/platforms/android/build/outputs/apk с помощью утилиты zip (в этом случае мы будем использовать WinRAR):

Шифровать исходный код Cordova App

И если вы попытаетесь редактировать некоторые из извлеченных файлов (наш app.js), то будет содержать:

Cordova APK содержимое исходного кода файла

Ты видишь то же, что и я ? Исходный код вашего приложения, доступный для чтения любому, кто знает, как открыть APK с помощью утилиты zip. Хотя наш код минимизирован для производства (не сделан кордовой, но нами), код все еще виден, он может быть довольно печатным и, следовательно, читаемым. Это не так хорошо (очевидно), поскольку ваш код может выявить недостатки безопасности (если таковые имеются) в таких функциях, как вход в ваше приложение, процесс платежей и т. Д.

Как говорят многие разработчики, и вам, вероятно, нужно знать, нет никакой 100% защиты от обратного инжиниринга. Вы можете сделать больше, чтобы защитить код своего приложения, но на самом деле это будет сложнее, в основном для обычного пользователя, который просто ищет в Google «Как взломать APK». Если кто-то действительно хочет взломать ваше приложение, оно может быть взломано, рано или поздно (если ваше приложение не общается с сервером и большинство функций не находятся на устройстве).

В этой статье вы узнаете, как защитить (или хотя бы повысить уровень защиты) исходный код вашего приложения в Cordova.

1. Установите плагин шифрования

Мы собираемся использовать плагин cordova-plugin-crypt-file зашифровать все файлы внутри www папка вашего проекта (файлы, которые включены в сгенерированный apk). Его можно использовать в любом проекте Cordova (даже если он использует Crosswalk), и хотя это руководство предназначено для использования только в Android, сам плагин также поддерживает платформы iOS.

Установите плагин, используя следующую команду в вашем терминале (как только вы окажетесь в папке вашего проекта):

cordova plugin add cordova-plugin-crypt-file

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

Как работает шифрование?

Этот плагин использует AES / CBC / PKCS5Padding алгоритм шифрования для шифрования файлов. Файлы шифруются плагином с использованием случайно сгенерированного ключа шифрования и вектора инициализации (IV) во время компиляции вашего приложения (это означает, что исходные файлы внутри вашего проекта не будут изменены, только файлы сгенерированного APK) , Как и ожидалось, файлы будут расшифровываться каждый раз, когда приложение будет установлено на установленном устройстве.

2. Настройка, какие файлы должны быть зашифрованы

Как упоминалось ранее, файлы зашифрованы, и нет никакого способа расшифровать их с помощью Javascript. Если вам нужен файл, который не нужно шифровать, вы можете настроить, какие файлы вы хотите зашифровать, с помощью специального регулярного выражения. Однако вам нужно будет указать это в файле плагина. Начните с открытия plugin.xml расположенный в /project/plugins/cordova-plugin-crypt-file и измените тег cryptfiles.

По умолчанию плагин включает следующее регулярное выражение, которое шифрует все файлы CSS, HTM, HTML и JS внутри каталога www:


Просто настройте регулярное выражение, чтобы указать, какие файлы будут зашифрованы, например, следующий тег будет сжимать только файлы html, htm, js, но не файлы css, и исключит один файл JS с именем example:


Сохраните изменения, как только они будут сделаны.

3. Проверьте, были ли файлы зашифрованы

Теперь после установки плагина (и необязательной настройки файлов для шифрования) вы можете проверить, работает ли плагин или нет. Повторите тот же процесс, упомянутый в начале статьи. Создайте свое приложение (в режиме отладки или в режиме выпуска) и используйте утилиту zip для просмотра содержимого www папка в вашем apk (assets/www):

Смотрите Apk Content Zip Utility

Как видите, структура файлов остается прежней. Наконец, отредактируйте любой из файлов (если он не исключен из шифрования) с помощью редактора кода, и вы увидите, что содержимое файла зашифровано:

Содержимое зашифрованного файла Cordova

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

Дополнительная безопасность

Вы можете использовать ProGuard в сгенерированном APK с Cordova. ProGuard оптимизирует байт-код, удаляет неиспользуемые инструкции кода и запутывает оставшиеся классы, поля и методы короткими именами. Запутанный код делает ваш APK сложным для обратного инжиниринга, что особенно ценно, когда ваше приложение использует чувствительные к безопасности функции, такие как проверка лицензии.

Создать proguard-rules.pro файл внутри /project/platforms/android папка со следующим содержимым:

# By default, the flags in this file are appended to flags specified
# in /usr/share/android-studio/data/sdk/tools/proguard/proguard-android.txt
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html
##---------------Begin: proguard configuration common for all Android apps ----------
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-verbose
-dump class_files.txt
-printseeds seeds.txt
-printusage unused.txt
-printmapping mapping.txt
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-allowaccessmodification
-keepattributes *Annotation*
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-repackageclasses ''
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService
# Explicitly preserve all serialization members. The Serializable interface
# is only a marker interface, so it wouldn't save them.
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# Preserve all native method names and the names of their classes.
-keepclasseswithmembernames class * {
native ;
}
-keepclasseswithmembernames class * {
public (android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembernames class * {
public (android.content.Context, android.util.AttributeSet, int);
}
# Preserve static fields of inner classes of R classes that might be accessed
# through introspection.
-keepclassmembers class **.R$* {
public static ;
}
# Preserve the special static methods that are required in all enumeration classes.
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep public class * {
public protected *;
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
##---------------End: proguard configuration common for all Android apps ----------
#---------------Begin: proguard configuration for support library  ----------
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep class com.actionbarsherlock.** { *; }
-keep interface com.actionbarsherlock.** { *; }
# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontwarn android.support.**
-dontwarn com.google.ads.**
##---------------End: proguard configuration for Gson  ----------
##---------------Begin: proguard configuration for Gson  ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.example.model.** { *; }
##---------------End: proguard configuration for Gson  ----------
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

Затем отредактируйте build.gradle файл (внутри /project/platforms/android или создайте плагин Cordova, который автоматически добавляет его в файл сборки:

android {
...
buildTypes {
debug {
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
...
}

В качестве последнего шага соберите свой apk в режиме релиза, используя cordova build android --release и ты готов к работе.

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

Если вы знаете разработчика Cordova, который, вероятно, не знает об этой проблеме, поделитесь этой статьей. Удачного кодирования!

Ссылка на основную публикацию
Adblock
detector