API de SafetyNet Verify Apps

La API de SafetyNet Verify Apps, una biblioteca con la tecnología de los Servicios de Google Play, permite que tu app interactúe de manera programática con la función Verificar aplicaciones en un dispositivo, lo que lo protege de aplicaciones potencialmente dañinas.

Si tu app administra datos sensibles del usuario, como información financiera, es importante que confirmes que el dispositivo del usuario está protegido contra apps maliciosas y que no tiene ninguna app que pueda suplantar la identidad de tu app o realizar otras acciones maliciosas. Si la seguridad del dispositivo no cumple con la postura de seguridad mínima, puedes inhabilitar la funcionalidad dentro de tu propia app con el objetivo de reducir el peligro para el usuario.

Como parte del compromiso continuo de hacer que el ecosistema de Android sea lo más seguro posible, Google supervisa y perfila el comportamiento de las apps para Android. Si la función Verificar aplicaciones detecta una app potencialmente dañina, se notifica a todos los usuarios que la instalaron y se les recomienda que la desinstalen de inmediato. El proceso protege la seguridad y la privacidad de los usuarios.

La API de SafetyNet Verify Apps te permite aprovechar esta función para proteger los datos de tu app. Si usas esta API, puedes determinar si el dispositivo de un usuario está protegido por la función Verificar aplicaciones, alentar a los usuarios que aún no la usan a que comiencen a hacerlo e identificar cualquier app conocida potencialmente dañina que esté instalada en el dispositivo.

Condiciones del Servicio adicionales

Cuando accedes a las APIs de SafetyNet o las usas, aceptas las Condiciones del Servicio de las APIs de Google y las siguientes Condiciones del Servicio de la API de Verify Apps. Asegúrate de leer y entender todos los términos y las políticas aplicables antes de acceder a las APIs.

Verifica las Condiciones del Servicio de la API de Verify Apps

Los análisis de apps que identifican aplicaciones potencialmente dañinas pueden generar falsos positivos y falsos negativos. Los resultados (o la falta de ellos) que se muestran en este paquete de API se presentan de la mejor manera posible. Reconoces y comprendes que no se garantiza que los resultados que muestra este paquete de API de SafetyNet sean exactos en todo momento.

Agrega la dependencia de la API de SafetyNet

Antes de usar la API de Verify Apps, agrega la API de SafetyNet a tu proyecto. Si usas Android Studio, agrega esta dependencia a tu archivo Gradle en el nivel de la app. Para obtener más información, consulta Cómo configurar la API de SafetyNet.

Cómo habilitar la verificación de apps

La API de SafetyNet Verify Apps proporciona dos métodos para habilitar la función Verificar aplicaciones. Puedes determinar si la verificación de apps está habilitada con isVerifyAppsEnabled(), y puedes solicitar la habilitación de la verificación de apps con enableVerifyApps().

La diferencia entre estos dos métodos es que, mientras isVerifyAppsEnabled() informa el estado actual de la función Verificar aplicaciones, enableVerifyApps() pide el consentimiento para usar la función al usuario de manera explícita. Si quieres que la app solo conozca el estado de la función para tomar una decisión de seguridad, tu app debe llamar a isVerifyAppsEnabled(). Sin embargo, si quieres asegurarte de que la app pueda enumerar aplicaciones potencialmente dañinas instaladas, debes llamar a enableVerifyApps().

Cómo determinar si la verificación de apps está habilitada

El método isVerifyAppsEnabled() asíncrono permite que tu app determine si el usuario está inscrito en la función Verificar aplicaciones. Este método devuelve un objeto VerifyAppsUserResponse que contiene información sobre todas las acciones que el usuario realizó en relación con la función Verificar aplicaciones, incluida la habilitación.

En el siguiente fragmento de código, se muestra cómo crear la devolución de llamada asociada con este método:

Kotlin

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.")
            }
        }

Java

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.");
            }
        }
    });

Cómo solicitar la habilitación de la verificación de apps

El método enableVerifyApps() asíncrono permite que tu app invoque un diálogo para solicitar que el usuario habilite la función Verificar aplicaciones. Este método muestra un objeto VerifyAppsUserResponse, que contiene información sobre todas las acciones que el usuario realizó en relación con la función Verificar aplicaciones, incluido el consentimiento para habilitarla.

En el siguiente fragmento de código, se muestra cómo crear la devolución de llamada asociada con este método:

Kotlin

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.")
            }
        }

Java

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.");
            }
        }
    });

Tu app puede encontrar una o más condiciones inusuales cuando usa este método:

  • Si la función Verificar aplicaciones ya está habilitada, el diálogo no aparece y la API se comporta como si el usuario hubiera dado el consentimiento para habilitar la función.
  • Si el usuario se aleja del diálogo, este se destruye y la API asume que el usuario no dio su consentimiento para habilitar la función.
  • Si tu app y otra app llaman a este método de forma simultánea, solo aparecerá un diálogo, y el método mostrará a las apps valores idénticos.

Lista de apps instaladas potencialmente dañinas

El método listHarmfulApps() asíncrono te permite obtener una lista de todas las apps potencialmente dañinas conocidas que el usuario instaló en su dispositivo. Esta lista incluye categorías para estas aplicaciones potencialmente dañinas identificadas, para que tu app pueda tomar las medidas adecuadas.

En el siguiente fragmento de código, se muestra cómo crear la devolución de llamada asociada con este método:

Kotlin

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."
                )
            }
        }

Java

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.");
            }
        }
    });