API de Verificar aplicaciones de SafetyNet

La API de Verificar aplicaciones de SafetyNet permite que tu app interactúe de manera programática con la función Verificar aplicaciones de un dispositivo para protegerlo contra apps potencialmente dañinas.

Si tu app maneja datos sensibles del usuario, como información financiera, debes confirmar que el dispositivo actual está protegido contra apps maliciosas y que no cuenta con apps que puedan suplantarlo o realizar otras acciones maliciosas. Si la seguridad del dispositivo no cumple con las medidas de seguridad mínimas, puedes inhabilitar la funcionalidad dentro de tu propia app a fin 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 Verificar aplicaciones de SafetyNet 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 aplicación potencialmente dañina conocida que esté instalada en el dispositivo.

Precaución: Aunque SafetyNet alerta a los usuarios sobre aplicaciones potencialmente dañinas, algunos optan por no desinstalar las apps o no ven la notificación de advertencia. Por lo tanto, un dispositivo podría tener instaladas este tipo de aplicaciones, incluso cuando la función Verificar aplicaciones está habilitada.

Condiciones del Servicio adicionales

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

Verifica las Condiciones del Servicio de la API de Verificar aplicaciones

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.

Cómo habilitar la verificación de apps

La API de Verificar aplicaciones de SafetyNet 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 la app determine si el usuario habilitó la función Verificar aplicaciones. Este método muestra un objeto VerifyAppsUserResult, 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 la app invoque un diálogo para solicitar que el usuario habilite la función Verificar aplicaciones. Este método muestra un objeto VerifyAppsUserResult, 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 varios casos límite 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 las aplicaciones potencialmente dañinas conocidas que el usuario instaló en el dispositivo. La lista incluye categorías de las aplicaciones identificadas, a fin de 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.");
                }
            }
        });