Обфускация всего приложения React Native, включая код JavaScript

Как запутать мой реактивный JS-код? Я установил следующее в моем файле build.gradle:

release {
      minifyEnabled true
      proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
 }

Вот мой файл proguard-rules.pro (по умолчанию):

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# 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 *;
#}

Но все же после разархивирования apk я могу найти имя моих компонентов JS, переменные и URL

Ответ 1

Поскольку ваш код React Native JavaScript построен на собственном коде для Android и iOS, весь процесс запутывания будет учитывать все три кодовые базы:

Запутать код Java для Android

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

  1. Обновите конфигурацию выпуска в файле build.gradle, расположенном в папке android/app/:

    def enableProguardInReleaseBuilds = true
    
    android {
        // other config omitted for brevity
        buildTypes {
            release {
                debuggable false
                shrinkResources enableProguardInReleaseBuilds
                zipAlignEnabled enableProguardInReleaseBuilds
                minifyEnabled enableProguardInReleaseBuilds
                useProguard enableProguardInReleaseBuilds
                setProguardFiles([getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'])
            }
        }
    }
    
  2. Включите запутывание ProGuard и измените правила соответствующим образом в файле proguard-rules.pro, расположенном в папке android/app/.

    Следующая строка кода должна быть закомментирована (добавьте # в начале строки):

    #-dontobfuscate
    

    На этом этапе сборки релизная версия вашего Android-приложения должна содержать запутанный Java-код. Проверьте это, проанализировав свой APK, в котором вы должны найти вызовы функций, такие как a, b вместо их реальных имен.

Код выше ссылается на Мария Корлотян Средний пост. Проверьте также последнюю конфигурацию React Native ProGuard по умолчанию из репозитория GitHub.

Начиная с версии бета-версии Android 3.3 можно использовать более оптимизированный обфускатор под названием R8.

Запутать код Objective-C для iOS

В проекте iOS нет встроенной библиотеки, которая бы запутывала ваш код, поэтому необходимо использовать внешний пакет. PPiOS-Rename и ObjC-Obfuscator - это два варианта. Подробную документацию можно найти в их репозиториях GitHub.

Запутать код JavaScript

Это было бы самой важной частью запутывания, поскольку наш реальный код написан на JavaScript. Пакет реактивный нативный обфускационный трансформатор npm можно использовать здесь:

  1. Добавьте пакет в ваш проект

    npm install react-native-obfuscating-transformer
    
  2. Добавьте/обновите конфигурацию CLI в rn-cli.config.js в корневом каталоге вашего проекта, где находятся папки android и ios.

    module.exports = {
     getTransformModulePath() {
       return require.resolve("./transformer")
     },
    }
    

    Создайте этот файл, если он еще не существует.

  3. Создайте файл transformer.js также в корне и укажите параметры конфигурации в зависимости от ситуации:

    const obfuscatingTransformer = require("react-native-obfuscating-transformer");
    
    module.exports = obfuscatingTransformer({
        /* Insert here any required configuration */
    });
    

    Обратите особое внимание на объем процесса запутывания, который по умолчанию нацелен только на файлы в папке src/ (по умолчанию node_modules исключен).


Принимая во внимание все вышесказанное, запутывание вашего приложения не сделает его изначально защищенным - хотя и безопасность могут быть лучше, чем только первые, есть много других улучшений безопасности (если не требований), которые могут быть реализованы в приложение React Native. Это включает в себя хранение конфиденциальной информации в безопасном хранилище (Keystore в Android/Keychain в iOS), реализацию закрепления сертификатов, если необходимо, и другие.

Другие полезные ссылки: