Получить контрольную сумму исходных кодов в Android-библиотеке
Я разрабатываю библиотеку android, и я хочу применить механизм обнаружения несанкционированного доступа к моему коду, поскольку он вызывает некоторые важные финансовые веб-службы.
То, что я собираюсь реализовать, - это вычислить контрольную сумму apk (или ее важных частей), программно в среде выполнения, чтобы я мог предотвратить перекомпилированный или перекомпилированный apk от возможности нанести какой-либо вред (защита от несанкционированного доступа).
То, что я до сих пор придумал, заключается в вычислении контрольной суммы applicationInfo.publicSourceDir
. но я не уверен, что происходит с приложениями с несколькими файлами dex или несколькими splitApks.
Каков наиболее надежный способ вычисления контрольной суммы на основе кодовой базы приложения в Android, программно?
Ответы
Ответ 1
Подход контрольной суммы может применяться к файлам с одним файлом или zip. Это будет длительный процесс проверки контрольной суммы всех файлов. Я думаю, вы находитесь в неправильном направлении.
Во-первых, нет четкого решения этой проблемы. Любое приложение может быть взломанным - вы можете просто затруднить его взломать.
Это то, что делается, чтобы сделать его трудным -
-
Зашифруйте свой apk - чтобы его трудно было добраться до исходного кода.
Refer - APK для защиты apk от обратного проектирования - Проверьте обфускацию
инструменты.
-
Используйте шифрование данных при отправке/получении данных из WebService. Вы можете использовать HMAC для защиты данных. Убедитесь, что ваш сервер достаточно умен, чтобы блокировать пользовательские/запрашивающие приложения в случае, если существует несколько плохих вызовов. HMAC прост в реализации и существуют библиотеки для генерации ключей HMAC.
Ответ 2
Если вы распространяете через игру, вы можете взглянуть на SafetyNet: https://developer.android.com/training/safetynet/index.html
Ответ 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;
}
Это можно сравнить с сохраненным значением, чтобы проверить, является ли сертификат подписи оригиналом или нет.