API Xác minh ứng dụng SafetyNet

API Xác minh ứng dụng SafetyNet (một thư viện do Dịch vụ Google Play cung cấp) cho phép ứng dụng của bạn tương tác theo phương thức lập trình với tính năng Xác minh ứng dụng trên một thiết bị, bảo vệ thiết bị đó khỏi các ứng dụng có khả năng gây hại.

Nếu ứng dụng của bạn xử lý dữ liệu nhạy cảm của người dùng, chẳng hạn như thông tin tài chính, thì bạn phải xác nhận rằng thiết bị của người dùng được bảo vệ khỏi các ứng dụng độc hại và không có bất kỳ ứng dụng nào có thể mạo danh ứng dụng của bạn hoặc thực hiện các hành động độc hại khác. Nếu mức độ bảo mật của thiết bị không đáp ứng được trạng thái bảo mật tối thiểu, thì bạn có thể tắt chức năng trong chính ứng dụng của mình để giảm nguy hiểm cho người dùng.

Để thực hiện cam kết lâu dài là đảm bảo hệ sinh thái Android an toàn nhất có thể, Google sẽ giám sát và lập hồ sơ hành vi của các ứng dụng Android. Nếu tính năng Xác minh ứng dụng phát hiện thấy một ứng dụng có thể gây nguy hiểm, thì mọi người dùng đã cài đặt ứng dụng đó sẽ được thông báo và khuyến khích gỡ ứng dụng ngay lập tức. Đây là quy trình nhằm bảo vệ tính bảo mật và quyền riêng tư của những người dùng này.

API Xác minh ứng dụng SafetyNet cho phép bạn tận dụng tính năng này để bảo vệ dữ liệu của ứng dụng. Bằng cách sử dụng API này, bạn có thể xác định xem thiết bị của người dùng có được bảo vệ bằng tính năng Xác minh ứng dụng hay không, khuyến khích những người dùng chưa sử dụng tính năng này chọn sử dụng để nhận được sự bảo vệ, đồng thời xác định mọi ứng dụng có khả năng gây hại được cài đặt trên thiết bị.

Điều khoản dịch vụ bổ sung

Bằng việc truy cập hoặc sử dụng các API SafetyNet, bạn đồng ý với Điều khoản dịch vụ dành cho các API của Google và Điều khoản dịch vụ sau đây của API Xác minh ứng dụng. Vui lòng đọc và nắm rõ tất cả các điều khoản và chính sách áp dụng trước khi truy cập vào các API này.

Điều khoản dịch vụ của API Xác minh ứng dụng

Việc phân tích các ứng dụng nhằm xác định ứng dụng có khả năng gây hại có thể dẫn đến cả kết quả dương tính giả và âm tính giả. Kết quả (hoặc không có kết quả) trả về từ bộ API này là những gì tốt nhất mà chúng tôi có thể cung cấp theo hiểu biết của mình. Bạn xác nhận và hiểu rằng kết quả mà bộ API SafetyNet này trả về không được đảm bảo là luôn chính xác.

Thêm phần phụ thuộc API SafetyNet

Trước khi sử dụng API Xác minh ứng dụng, hãy thêm API SafetyNet vào dự án của bạn. Nếu bạn đang sử dụng Android Studio, hãy thêm phần phụ thuộc này vào tệp Gradle cấp ứng dụng. Để biết thêm thông tin, hãy xem phần Thiết lập API SafetyNet.

Bật tính năng xác minh ứng dụng

API Xác minh ứng dụng SafetyNet cung cấp 2 phương thức để bật tính năng Xác minh ứng dụng. Bạn có thể xác định xem đã bật tính năng xác minh ứng dụng hay chưa bằng cách sử dụng isVerifyAppsEnabled(), đồng thời bạn có thể yêu cầu bật tính năng xác minh ứng dụng bằng enableVerifyApps().

Điểm khác biệt giữa 2 phương thức này đó là trong khi isVerifyAppsEnabled() báo cáo trạng thái hiện tại của tính năng Xác minh ứng dụng, thì enableVerifyApps() sẽ yêu cầu người dùng phải đồng ý một cách rõ ràng thì mới được sử dụng tính năng này. Nếu bạn chỉ muốn ứng dụng nhận biết được trạng thái của tính năng để đưa ra quyết định dựa trên tính bảo mật, thì ứng dụng nên gọi isVerifyAppsEnabled(). Tuy nhiên, nếu muốn đảm bảo rằng ứng dụng của mình có thể liệt kê các ứng dụng đã cài đặt có khả năng gây hại, thì bạn nên gọi enableVerifyApps().

Xác định xem tính năng xác minh ứng dụng đã được bật hay chưa

Phương thức isVerifyAppsEnabled() không đồng bộ cho phép ứng dụng của bạn xác định liệu người dùng đã đăng ký tính năng Xác minh ứng dụng hay chưa. Phương thức này trả về một đối tượng VerifyAppsUserResponse chứa thông tin về mọi thao tác mà người dùng đã thực hiện liên quan đến tính năng Xác minh ứng dụng, bao gồm cả thao tác bật tính năng này.

Đoạn mã sau đây minh hoạ cách tạo lệnh gọi lại liên kết với phương thức này:

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

Yêu cầu bật tính năng xác minh ứng dụng

Phương thức enableVerifyApps() không đồng bộ cho phép ứng dụng của bạn gọi một hộp thoại yêu cầu người dùng bật tính năng Xác minh ứng dụng. Phương thức này trả về một đối tượng VerifyAppsUserResponse chứa thông tin về mọi thao tác mà người dùng đã thực hiện liên quan đến tính năng Xác minh ứng dụng, bao gồm cả việc họ đã đồng ý bật tính năng này hay chưa.

Đoạn mã sau đây minh hoạ cách tạo lệnh gọi lại liên kết với phương thức này:

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

Ứng dụng của bạn có thể gặp phải một hoặc nhiều tình trạng bất thường khi sử dụng phương thức này:

  • Nếu tính năng Xác minh ứng dụng đã được bật, hộp thoại sẽ không xuất hiện và API sẽ hoạt động như thể người dùng đã đồng ý bật tính năng này.
  • Nếu người dùng rời khỏi hộp thoại này, thì hộp thoại sẽ bị huỷ bỏ và API giả định rằng người dùng không đồng ý bật tính năng này.
  • Nếu ứng dụng của bạn và một ứng dụng khác gọi phương thức này cùng lúc, thì chỉ một hộp thoại xuất hiện và tất cả các ứng dụng đều nhận được giá trị trả về giống hệt nhau từ phương thức này.

Liệt kê các ứng dụng đã cài đặt có khả năng gây hại

Phương thức listHarmfulApps() không đồng bộ cho phép bạn lấy danh sách mọi ứng dụng có khả năng gây hại đã biết mà người dùng đã cài đặt trên thiết bị của họ. Danh sách này bao gồm các danh mục ứng dụng có khả năng gây hại đã xác định để ứng dụng của bạn có thể thực hiện hành động thích hợp.

Đoạn mã sau đây minh hoạ cách tạo lệnh gọi lại liên kết với phương thức này:

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