API проверки приложений SafetyNet, библиотека на базе сервисов Google Play , позволяет вашему приложению программно взаимодействовать с функцией проверки приложений на устройстве, защищая устройство от потенциально вредоносных приложений.
Если ваше приложение обрабатывает конфиденциальные пользовательские данные, например, финансовую информацию, важно убедиться, что устройство пользователя защищено от вредоносных приложений и на нем нет приложений, которые могут выдавать себя за ваше приложение или выполнять другие вредоносные действия. Если уровень безопасности устройства не соответствует минимальным требованиям, вы можете отключить соответствующие функции в своем приложении, чтобы снизить риск для пользователя.
В рамках своего постоянного стремления сделать экосистему Android максимально безопасной, Google отслеживает и профилирует поведение приложений Android. Если функция проверки приложений обнаруживает потенциально опасное приложение, все пользователи, установившие это приложение, получают уведомление с рекомендацией незамедлительно удалить его. Этот процесс защищает безопасность и конфиденциальность этих пользователей.
API SafetyNet Verify Apps позволяет использовать эту функцию для защиты данных вашего приложения. С помощью этого API вы можете определить, защищено ли устройство пользователя функцией «Проверка приложений», побудить пользователей, которые ещё не используют эту функцию, включить её защиту и выявить любые известные потенциально опасные приложения, установленные на устройстве.
Дополнительные условия обслуживания
Получая доступ к API SafetyNet или используя их, вы соглашаетесь с Условиями использования API Google и следующими Условиями использования API Verify Apps. Перед использованием API, пожалуйста, ознакомьтесь со всеми применимыми условиями и политиками.
Условия обслуживания API приложений Verify
Анализ приложений, выявляющий потенциально вредоносные приложения, может давать как ложноположительные, так и ложноотрицательные результаты. Результаты (или их отсутствие), возвращаемые данным набором API, представлены в меру нашего понимания. Вы признаете и понимаете, что результаты, возвращаемые данным набором API SafetyNet, не всегда являются точными.Добавьте зависимость API SafetyNet
Перед использованием API проверки приложений добавьте API SafetyNet в свой проект. Если вы используете Android Studio, добавьте эту зависимость в файл Gradle уровня приложения. Подробнее см. в разделе Настройка API SafetyNet .
Включить проверку приложения
API SafetyNet Verify Apps предоставляет два метода включения функции проверки приложений. Вы можете определить, включена ли проверка приложений, с помощью метода isVerifyAppsEnabled()
, а запросить включение проверки приложений можно с помощью enableVerifyApps()
.
Разница между этими двумя методами заключается в том, что isVerifyAppsEnabled()
сообщает текущий статус функции «Проверка приложений», enableVerifyApps()
явно запрашивает у пользователя согласие на использование этой функции. Если вы хотите, чтобы ваше приложение просто знало статус функции для принятия решения, основанного на соображениях безопасности, вы должны вызвать isVerifyAppsEnabled()
. Однако, если вы хотите быть уверены, что ваше приложение может выводить список установленных потенциально опасных приложений, вы должны вызвать enableVerifyApps()
.
Определите, включена ли проверка приложения
Асинхронный метод isVerifyAppsEnabled()
позволяет вашему приложению определить, зарегистрирован ли пользователь в функции проверки приложений. Этот метод возвращает объект VerifyAppsUserResponse
, содержащий информацию обо всех действиях пользователя, связанных с функцией проверки приложений, включая её включение.
В следующем фрагменте кода показано, как создать обратный вызов, связанный с этим методом:
Котлин
SafetyNet.getClient(this) .isVerifyAppsEnabled .addOnCompleteListener { task -> if (task.isSuccessful) { if (task.result.isVerifyAppsEnabled) { Log.d("MY_APP_TAG", "The Verify Apps feature is enabled.") } else { Log.d("MY_APP_TAG", "The Verify Apps feature is disabled.") } } else { Log.e("MY_APP_TAG", "A general error occurred.") } }
Ява
SafetyNet.getClient(this) .isVerifyAppsEnabled() .addOnCompleteListener(new OnCompleteListener<VerifyAppsUserResponse>() { @Override public void onComplete(Task<VerifyAppsUserResponse> task) { if (task.isSuccessful()) { VerifyAppsUserResponse result = task.getResult(); if (result.isVerifyAppsEnabled()) { Log.d("MY_APP_TAG", "The Verify Apps feature is enabled."); } else { Log.d("MY_APP_TAG", "The Verify Apps feature is disabled."); } } else { Log.e("MY_APP_TAG", "A general error occurred."); } } });
Запросить включение проверки приложения
Асинхронный метод enableVerifyApps()
позволяет вашему приложению вызывать диалоговое окно с запросом на включение функции проверки приложений. Этот метод возвращает объект VerifyAppsUserResponse
, содержащий информацию обо всех действиях пользователя, связанных с функцией проверки приложений, включая согласие на её включение.
В следующем фрагменте кода показано, как создать обратный вызов, связанный с этим методом:
Котлин
SafetyNet.getClient(this) .enableVerifyApps() .addOnCompleteListener { task -> if (task.isSuccessful) { if (task.result.isVerifyAppsEnabled) { Log.d("MY_APP_TAG", "The user gave consent to enable the Verify Apps feature.") } else { Log.d( "MY_APP_TAG", "The user didn't give consent to enable the Verify Apps feature." ) } } else { Log.e("MY_APP_TAG", "A general error occurred.") } }
Ява
SafetyNet.getClient(this) .enableVerifyApps() .addOnCompleteListener(new OnCompleteListener<VerifyAppsUserResponse>() { @Override public void onComplete(Task<VerifyAppsUserResponse> task) { if (task.isSuccessful()) { VerifyAppsUserResponse result = task.getResult(); if (result.isVerifyAppsEnabled()) { Log.d("MY_APP_TAG", "The user gave consent " + "to enable the Verify Apps feature."); } else { Log.d("MY_APP_TAG", "The user didn't give consent " + "to enable the Verify Apps feature."); } } else { Log.e("MY_APP_TAG", "A general error occurred."); } } });
При использовании этого метода ваше приложение может столкнуться с одной или несколькими необычными ситуациями:
- Если функция проверки приложений уже включена, диалоговое окно не появляется, а API ведет себя так, как будто пользователь дал согласие на включение этой функции.
- Если пользователь выходит из диалогового окна, диалоговое окно уничтожается, и API предполагает, что пользователь не давал согласия на включение этой функции.
- Если ваше приложение и другое приложение одновременно вызывают этот метод, появляется только одно диалоговое окно, и все приложения получают одинаковые возвращаемые значения от метода.
Список потенциально опасных установленных приложений
Асинхронный метод listHarmfulApps()
позволяет получить список всех известных потенциально вредоносных приложений, установленных пользователем на его устройстве. Этот список включает категории для выявленных потенциально вредоносных приложений, чтобы ваше приложение могло предпринять соответствующие действия.
В следующем фрагменте кода показано, как создать обратный вызов, связанный с этим методом:
Котлин
SafetyNet.getClient(this) .listHarmfulApps() .addOnCompleteListener { task -> Log.d(TAG, "Received listHarmfulApps() result") if (task.isSuccessful) { val result = task.result val scanTimeMs = result.lastScanTimeMs val appList = result.harmfulAppsList if (appList?.isNotEmpty() == true) { Log.e("MY_APP_TAG", "Potentially harmful apps are installed!") for (harmfulApp in appList) { Log.e("MY_APP_TAG", "Information about a harmful app:") Log.e("MY_APP_TAG", " APK: ${harmfulApp.apkPackageName}") Log.e("MY_APP_TAG", " SHA-256: ${harmfulApp.apkSha256}") // Categories are defined in VerifyAppsConstants. Log.e("MY_APP_TAG", " Category: ${harmfulApp.apkCategory}") } } else { Log.d("MY_APP_TAG", "There are no known potentially harmful apps installed.") } } else { Log.d( "MY_APP_TAG", "An error occurred. Call isVerifyAppsEnabled() to ensure that the user " + "has consented." ) } }
Ява
SafetyNet.getClient(this) .listHarmfulApps() .addOnCompleteListener(new OnCompleteListener<HarmfulAppsResponse>() { @Override public void onComplete(Task<HarmfulAppsResponse> task) { Log.d(TAG, "Received listHarmfulApps() result"); if (task.isSuccessful()) { HarmfulAppsResponse result = task.getResult(); long scanTimeMs = result.getLastScanTimeMs(); List<HarmfulAppsData> appList = result.getHarmfulAppsList(); if (appList.isEmpty()) { Log.d("MY_APP_TAG", "There are no known " + "potentially harmful apps installed."); } else { Log.e("MY_APP_TAG", "Potentially harmful apps are installed!"); for (HarmfulAppsData harmfulApp : appList) { Log.e("MY_APP_TAG", "Information about a harmful app:"); Log.e("MY_APP_TAG", " APK: " + harmfulApp.apkPackageName); Log.e("MY_APP_TAG", " SHA-256: " + harmfulApp.apkSha256); // Categories are defined in VerifyAppsConstants. Log.e("MY_APP_TAG", " Category: " + harmfulApp.apkCategory); } } } else { Log.d("MY_APP_TAG", "An error occurred. " + "Call isVerifyAppsEnabled() to ensure " + "that the user has consented."); } } });