Получить контрольную сумму исходных кодов в Android-библиотеке

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

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

То, что я до сих пор придумал, заключается в вычислении контрольной суммы applicationInfo.publicSourceDir. но я не уверен, что происходит с приложениями с несколькими файлами dex или несколькими splitApks.

Каков наиболее надежный способ вычисления контрольной суммы на основе кодовой базы приложения в Android, программно?

Ответ 1

Подход контрольной суммы может применяться к файлам с одним файлом или zip. Это будет длительный процесс проверки контрольной суммы всех файлов. Я думаю, вы находитесь в неправильном направлении.

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

Это то, что делается, чтобы сделать его трудным -

  • Зашифруйте свой apk - чтобы его трудно было добраться до исходного кода. Refer - APK для защиты apk от обратного проектирования - Проверьте обфускацию инструменты.

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

Ответ 3

Получить подпись приложения, привязанную к сертификату, используемому для подписания APK

public static String getAppSignature(Context context) {
    try {
        for (Signature signature : context.getPackageManager().getPackageInfo(context.getPackageName(),
                PackageManager.GET_SIGNATURES).signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            return Base64.encodeToString(md.digest(), Base64.DEFAULT);
        }
    } catch (Exception e) { /* Do nothing */ }
    return null;
}

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