API SafetyNet Verify Apps

API SafetyNet Verify Apps, библиотека на базе сервисов Google Play , позволяет вашему приложению программно взаимодействовать с функцией Verify Apps на устройстве, защищая устройство от потенциально вредоносных приложений.

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

В рамках своего постоянного стремления сделать экосистему Android максимально безопасной Google отслеживает и профилирует поведение приложений Android. Если функция «Проверка приложений» обнаруживает потенциально опасное приложение, все пользователи, установившие это приложение, получают уведомление и им предлагается незамедлительно удалить его. Этот процесс защищает безопасность и конфиденциальность этих пользователей.

API SafetyNet Verify Apps позволяет использовать эту функцию для защиты данных вашего приложения. Используя этот API, вы можете определить, защищено ли устройство пользователя функцией проверки приложений, предложить пользователям, которые еще не используют эту функцию, включить ее защиту, а также выявить любые известные потенциально опасные приложения, установленные на устройстве. .

Дополнительные условия обслуживания

Получая доступ к API SafetyNet или используя их, вы соглашаетесь с Условиями обслуживания API Google и следующими Условиями использования API Verify Apps. Прежде чем получить доступ к API, прочтите и поймите все применимые условия и политики.

Проверьте Условия использования Apps API

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

Добавьте зависимость API SafetyNet

Прежде чем использовать API Verify Apps, добавьте API SafetyNet в свой проект. Если вы используете Android Studio, добавьте эту зависимость в файл Gradle на уровне приложения. Дополнительную информацию см. в разделе Настройка SafetyNet API .

Включить проверку приложения

API SafetyNet Verify Apps предоставляет два метода включения функции 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.");
            }
        }
    });