API SafetyNet Verification Apps

L'API SafetyNet Verifica app, una libreria basata su Google Play Services, consente alla tua app di interagire in modo programmatico con la funzionalità Verifica app su un dispositivo, proteggendolo da app potenzialmente dannose.

Se la tua app gestisce dati utente sensibili, come informazioni finanziarie, è importante verificare che il dispositivo dell'utente sia protetto dalle app dannose e che non siano presenti app che potrebbero rubare l'identità della tua app o eseguire altre azioni dannose. Se la sicurezza del dispositivo non soddisfa la postura di sicurezza minima, puoi disattivare le funzionalità all'interno della tua app per ridurre il pericolo per l'utente.

Nell'ambito del suo costante impegno per rendere l'ecosistema Android il più sicuro possibile, Google monitora e profila il comportamento delle app per Android. Se la funzionalità di verifica delle app rileva un'app potenzialmente pericolosa, tutti gli utenti che hanno installato l'app vengono avvisati e invitati a disinstallarla tempestivamente. Questo processo protegge la sicurezza e la privacy di questi utenti.

L'API SafetyNet Verify Apps ti consente di sfruttare questa funzionalità per proteggere i dati della tua app. Utilizzando questa API, puoi determinare se il dispositivo di un utente è protetto dalla funzione Verifica app, incoraggiare gli utenti che non utilizzano già la funzione ad attivare la relativa protezione e identificare eventuali app potenzialmente dannose installate sul dispositivo.

Termini di servizio aggiuntivi

Accedendo o utilizzando le API SafetyNet, accetti i Termini di servizio delle API di Google e i seguenti Termini di servizio dell'API Verify Apps. Prima di accedere alle API, leggi e comprendi tutti i termini e le norme vigenti.

Termini di servizio di Verifica dell'API Apps

Le analisi delle app che identificano app potenzialmente dannose possono produrre sia falsi positivi sia falsi negativi. I risultati (o la loro mancanza) restituiti da questa suite API vengono presentati nel modo migliore possibile. Riconosci e comprendi che i risultati restituiti da questa suite di API SafetyNet non sono garantiti come accurati in ogni momento.

Aggiungi la dipendenza dall'API SafetyNet

Prima di utilizzare l'API Verify Apps, aggiungi l'API SafetyNet al tuo progetto. Se utilizzi Android Studio, aggiungi questa dipendenza al file Gradle a livello di app. Per ulteriori informazioni, consulta la configurazione dell'API SafetyNet.

Attivare la verifica dell'app

L'API SafetyNet Verify Apps fornisce due metodi per attivare la funzionalità Verifica app. Puoi determinare se la verifica dell'app è attiva utilizzando isVerifyAppsEnabled() e puoi richiedere l'attivazione della verifica dell'app utilizzando enableVerifyApps().

La differenza tra questi due metodi è che, mentre isVerifyAppsEnabled() segnala lo stato corrente della funzionalità Verifica app, enableVerifyApps() chiede esplicitamente all'utente il consenso per l'utilizzo della funzionalità. Se vuoi che la tua app sia semplicemente a conoscenza dello stato della funzionalità per prendere una decisione in base alla sicurezza, deve chiamare isVerifyAppsEnabled(). Tuttavia, se vuoi assicurarti che la tua app possa elencare le app installate potenzialmente dannose, devi chiamare enableVerifyApps().

Determinare se la verifica dell'app è attiva

Il metodo asincrono isVerifyAppsEnabled() consente alla tua app di determinare se l'utente è registrato alla funzionalità Verifica app. Questo metodo restituisce un oggetto VerifyAppsUserResponse contenente informazioni relative a tutte le azioni intraprese dall'utente relative alla funzionalità di verifica delle app, compresa la sua abilitazione.

Il seguente snippet di codice mostra come creare il callback associato a questo metodo:

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

Richiedi l'attivazione della verifica app

Il metodo enableVerifyApps() asincrono consente alla tua app di richiamare una finestra di dialogo che richiede all'utente di attivare la funzionalità Verifica app. Questo metodo restituisce un oggetto VerifyAppsUserResponse, che contiene informazioni relative a tutte le azioni intraprese dall'utente relative alla funzionalità Verifica app, incluso se ha dato il consenso per abilitarla.

Il seguente snippet di codice mostra come creare il callback associato a questo metodo:

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

La tua app può riscontrare una o più condizioni insolite quando utilizzi questo metodo:

  • Se la funzione Verifica app è già abilitata, la finestra di dialogo non viene visualizzata e l'API si comporta come se l'utente avesse dato il consenso ad abilitare questa funzione.
  • Se l'utente esce dalla finestra di dialogo, questa viene distrutta e l'API assume che l'utente non abbia dato il consenso per attivare questa funzionalità.
  • Se la tua app e un'altra chiamano questo metodo contemporaneamente, viene visualizzata una sola finestra di dialogo e tutte le app ricevono valori di ritorno identici dal metodo.

Elenco delle app installate potenzialmente dannose

Il metodo asincrono listHarmfulApps() ti consente di ottenere un elenco di tutte le app potenzialmente dannose note che l'utente ha installato sul suo dispositivo. Questo elenco include le categorie delle app potenzialmente dannose identificate in modo che la tua app possa intraprendere le azioni appropriate.

Il seguente snippet di codice mostra come creare il callback associato a questo metodo:

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