SafetyNet 应用程序验证 API

SafetyNet 应用程序验证 API 是由 Google Play 服务 提供支持的库,它允许您的应用程序以编程方式与设备上的 应用程序验证 功能进行交互,保护设备免受潜在有害应用程序的侵害。

如果您的应用程序处理敏感用户数据(例如财务信息),则必须确认用户设备已免受恶意应用程序的侵害,并且没有任何应用程序可以冒充您的应用程序或执行其他恶意操作。如果设备的安全级别未达到最低安全级别,您可以禁用您自己应用程序中的功能以减少对用户的危害。

作为持续努力使 Android 生态系统尽可能安全的承诺的一部分,Google 会监控和分析 Android 应用程序的行为。如果应用程序验证功能检测到潜在有害的应用程序,所有已安装该应用程序的用户都会收到通知,并鼓励他们立即卸载该应用程序。此流程可保护这些用户的安全和隐私。

SafetyNet 应用程序验证 API 允许您利用此功能保护应用程序的数据。通过使用此 API,您可以确定用户的设备是否受应用程序验证功能的保护,鼓励尚未使用此功能的用户选择加入其保护,并识别设备上安装的任何已知的潜在有害应用程序。

其他服务条款

通过访问或使用 SafetyNet API,您同意 Google API 服务条款 以及以下应用程序验证 API 服务条款。在访问 API 之前,请仔细阅读并理解所有适用的条款和政策。

应用程序验证 API 服务条款

识别潜在有害应用程序的应用程序分析可能会产生误报和漏报。此 API 套件返回的结果(或缺乏结果)是根据我们目前的理解提供的。您承认并理解,此 SafetyNet API 套件返回的结果并非始终保证准确。

添加 SafetyNet API 依赖项

在使用应用程序验证 API 之前,请将 SafetyNet API 添加到您的项目中。如果您使用的是 Android Studio,请将此依赖项添加到您的应用程序级 Gradle 文件中。有关更多信息,请参阅 SafetyNet API 设置

启用应用程序验证

SafetyNet 应用程序验证 API 提供两种方法来启用应用程序验证功能。您可以使用 isVerifyAppsEnabled() 确定应用程序验证是否已启用,并且您可以使用 enableVerifyApps() 请求启用应用程序验证。

这两种方法之间的区别在于,isVerifyAppsEnabled() 报告应用程序验证功能的当前状态,而 enableVerifyApps() 明确地要求用户同意使用此功能。如果您的应用程序只是想知道此功能的状态以便做出安全驱动型决策,则您的应用程序应调用 isVerifyAppsEnabled()。但是,如果您希望确保您的应用程序可以列出潜在有害的已安装应用程序,则应改为调用 enableVerifyApps()

确定应用程序验证是否已启用

异步 isVerifyAppsEnabled() 方法允许您的应用程序确定用户是否已加入应用程序验证功能。此方法返回一个 VerifyAppsUserResponse 对象,其中包含有关用户对应用程序验证功能执行的所有操作的信息,包括启用它。

以下代码段显示了如何创建与此方法关联的回调

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

请求启用应用程序验证

异步 enableVerifyApps() 方法允许您的应用程序调用一个对话框,要求用户启用应用程序验证功能。此方法返回一个 VerifyAppsUserResponse 对象,其中包含有关用户对应用程序验证功能执行的所有操作的信息,包括他们是否已同意启用它。

以下代码段显示了如何创建与此方法关联的回调

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

在使用此方法时,您的应用程序可能会遇到一个或多个异常情况

  • 如果应用程序验证功能已启用,则不会显示对话框,并且 API 的行为就像用户已同意启用此功能一样。
  • 如果用户从对话框中导航离开,则对话框将被销毁,并且 API 假设用户没有同意启用此功能。
  • 如果您的应用程序和另一个应用程序同时调用此方法,则只会显示一个对话框,并且所有应用程序都将收到相同的方法返回值。

列出潜在有害的已安装应用程序

异步 listHarmfulApps() 方法允许您获取用户在设备上安装的任何已知的潜在有害应用程序的列表。此列表包括已识别的潜在有害应用程序的类别,以便您的应用程序可以采取适当的操作。

以下代码段显示了如何创建与此方法关联的回调

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