API SafetyNet Verify Apps

A API SafetyNet Verify Apps, uma biblioteca com tecnologia do Google Play Services, permite que o app interaja programaticamente com o recurso Verificar apps, o que protege o dispositivo contra apps potencialmente nocivos.

Se o app processa dados sensíveis do usuário, como informações financeiras, é importante confirmar se o dispositivo do usuário está protegido contra apps maliciosos e não tem apps que possam falsificar seu app ou realizar outras ações maliciosas. Se a segurança do dispositivo não atender à postura mínima de segurança, você poderá desativar a funcionalidade no próprio app para reduzir o perigo ao usuário.

Como parte do compromisso contínuo de tornar o ecossistema do Android o mais seguro possível, o Google monitora e cria perfis de comportamento dos apps para Android. Se o recurso Verificar apps detectar um app potencialmente nocivo, todos os usuários que instalaram o app serão notificados e incentivados a desinstalá-lo imediatamente. Esse processo protege a segurança e a privacidade desses usuários.

A API SafetyNet Verify Apps permite usar esse recurso para proteger os dados do app. Com essa API, você pode determinar se o dispositivo de um usuário é protegido pelo recurso Verificar apps, incentivar os usuários que ainda não usam o recurso a ativar a proteção dele e identificar os apps potencialmente nocivos conhecidos que estão instalados no dispositivo.

Outros Termos de Serviço

Ao acessar ou usar as APIs SafetyNet, você concorda com os Termos de Serviço das APIs do Google e com os Termos de Serviço da API Verify Apps abaixo. Leia e entenda todos os termos e políticas aplicáveis antes de acessar as APIs.

Termos de Serviço da API Verify Apps

As análises que identificam apps potencialmente nocivos podem resultar em falsos positivos e falsos negativos. Os resultados (ou a falta deles) retornados desse conjunto de APIs são apresentados da melhor forma possível. Você reconhece e entende que os resultados retornados por esse conjunto da API SafetyNet não têm garantia de serem precisos em todos os momentos.

Adicionar a dependência da API SafetyNet

Antes de usar a API Verify Apps, adicione a API SafetyNet ao seu projeto. Se você estiver usando o Android Studio, adicione essa dependência ao arquivo do Gradle no nível do app. Para mais informações, consulte Configuração da API SafetyNet.

Ativar a verificação de apps

A API SafetyNet Verify Apps oferece dois métodos para ativar o recurso Verificar apps. Você pode determinar se a verificação de apps está habilitada usando isVerifyAppsEnabled() e pedir a ativação da verificação de apps usando enableVerifyApps().

A diferença entre esses dois métodos é que, enquanto isVerifyAppsEnabled() informa o status atual do recurso Verificar apps, o enableVerifyApps() pede explicitamente ao usuário permissão para usar o recurso. Se você quer que seu app só esteja ciente do status do recurso para tomar decisões voltadas à segurança, o app precisa chamar isVerifyAppsEnabled(). No entanto, se você quiser garantir que seu app possa listar os apps potencialmente nocivos instalados, chame enableVerifyApps().

Determinar se a verificação de apps está ativada

O método isVerifyAppsEnabled() assíncrono permite que seu app determine se o usuário está registrado no recurso Verificar apps. Esse método retorna um objeto VerifyAppsUserResponse, que contém informações sobre todas as ações que o usuário tenha tomado com relação ao recurso Verificar apps, incluindo a ativação dele.

O snippet de código abaixo mostra como criar o callback associado a esse 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.");
            }
        }
    });

Pedir a ativação da verificação de apps

O método enableVerifyApps() assíncrono permite que seu app invoque uma caixa de diálogo pedindo que o usuário ative o recurso Verificar apps. Esse método retorna um objeto VerifyAppsUserResponse, que contém informações sobre todas as ações que o usuário tenha tomado com relação ao recurso Verificar apps, inclusive se foi concedida permissão para a ativação dele.

O snippet de código abaixo mostra como criar o callback associado a esse 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.");
            }
        }
    });

Seu app pode encontrar uma ou mais condições incomuns ao usar esse método:

  • Se o recurso Verificar apps já estiver ativado, a caixa de diálogo não será mostrada e a API vai se comportar como se o usuário tivesse acabado de dar permissão para ativar esse recurso.
  • Se o usuário sair da caixa de diálogo, ela será destruída, e a API vai presumir que o usuário não autorizou a ativação desse recurso.
  • Caso seu aplicativo e outro app chamem esse método simultaneamente, apenas uma caixa de diálogo será mostrada, e todos os apps vão receber valores de retorno idênticos do método.

Listar apps potencialmente nocivos instalados

O método assíncrono listHarmfulApps() permite que você acesse uma lista de todos os apps potencialmente nocivos conhecidos que o usuário instalou no dispositivo. Essa lista inclui categorias dos apps potencialmente nocivos identificados para que seu app possa tomar as medidas adequadas.

O snippet de código abaixo mostra como criar o callback associado a esse 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.");
            }
        }
    });