SafetyNet Verify Apps API

SafetyNet Verify Apps API ซึ่งเป็นไลบรารีที่ขับเคลื่อนโดย บริการ Google Play จะช่วยให้แอปของคุณโต้ตอบกับฟีเจอร์ตรวจสอบแอปในอุปกรณ์แบบเป็นโปรแกรมได้ ซึ่งจะช่วยปกป้องอุปกรณ์จากแอปที่อาจเป็นอันตราย

หากแอปของคุณจัดการข้อมูลที่ละเอียดอ่อนของผู้ใช้ เช่น ข้อมูลทางการเงิน คุณควรตรวจสอบว่าอุปกรณ์ของผู้ใช้ได้รับการปกป้องจากแอปที่เป็นอันตรายและไม่มีแอปที่อาจแอบอ้างเป็นแอปของคุณหรือดําเนินการอื่นๆ ที่อาจเป็นอันตราย หากการรักษาความปลอดภัยของอุปกรณ์ไม่ตรงตามระดับความปลอดภัยขั้นต่ำ คุณสามารถปิดฟังก์ชันการทำงานภายในแอปของตนเองเพื่อลดอันตรายต่อผู้ใช้

Google ตรวจสอบและสร้างโปรไฟล์พฤติกรรมของแอป Android เพื่อเป็นส่วนหนึ่งของความมุ่งมั่นอย่างต่อเนื่องที่จะทำให้ระบบนิเวศ Android ปลอดภัยมากที่สุด หากฟีเจอร์ยืนยันแอปตรวจพบแอปที่อาจเป็นอันตราย ระบบจะแจ้งเตือนผู้ใช้ทุกคนที่ติดตั้งแอปดังกล่าวและแนะนำให้ผู้ใช้ถอนการติดตั้งแอปโดยทันที กระบวนการนี้ช่วยปกป้องความปลอดภัยและความเป็นส่วนตัวของผู้ใช้เหล่านี้

SafetyNet Verify Apps API ช่วยให้คุณใช้ประโยชน์จากฟีเจอร์นี้เพื่อปกป้องข้อมูลของแอปได้ เมื่อใช้ API นี้ คุณจะระบุได้ว่าอุปกรณ์ของผู้ใช้ได้รับการปกป้องโดยฟีเจอร์ยืนยันแอปหรือไม่ กระตุ้นให้ผู้ใช้ที่ไม่ได้ใช้ฟีเจอร์นี้เลือกใช้การปกป้อง และระบุแอปที่อาจเป็นอันตรายซึ่งติดตั้งอยู่ในอุปกรณ์

ข้อกำหนดในการให้บริการเพิ่มเติม

การเข้าถึงหรือใช้ SafetyNet API หมายความว่าคุณยอมรับข้อกำหนดในการให้บริการของ Google APIs และข้อกำหนดในการให้บริการ Verify Apps API ต่อไปนี้ โปรดอ่านและทำความเข้าใจข้อกำหนดและนโยบายที่เกี่ยวข้องทั้งหมดก่อนเข้าถึง API

ข้อกำหนดในการให้บริการของ Verify Apps API

การวิเคราะห์แอปที่ระบุแอปที่อาจเป็นอันตรายอาจให้ผลลัพธ์ทั้งบวกเท็จและลบเท็จ ผลลัพธ์ (หรือไม่มี) ที่แสดงจากชุด API นี้จะแสดงตามความเข้าใจของเรา คุณรับทราบและเข้าใจว่าผลลัพธ์ที่ชุด SafetyNet API แสดงนั้นไม่รับประกันว่าถูกต้องเสมอไป

เพิ่มข้อกําหนดของ SafetyNet API

ก่อนใช้ Verify Apps API ให้เพิ่ม SafetyNet API ลงในโปรเจ็กต์ หากคุณใช้ Android Studio ให้เพิ่มทรัพยากร Dependency นี้ลงในไฟล์ Gradle ระดับแอป ดูข้อมูลเพิ่มเติมได้ที่การตั้งค่า SafetyNet API

เปิดใช้การตรวจสอบแอป

SafetyNet Verify Apps API มี 2 วิธีในการเปิดใช้ฟีเจอร์ Verify Apps คุณสามารถตรวจสอบว่าเปิดใช้การยืนยันแอปหรือไม่โดยใช้ isVerifyAppsEnabled() และขอเปิดใช้การยืนยันแอปได้โดยใช้ enableVerifyApps()

ความแตกต่างระหว่าง 2 วิธีการนี้คือ แม้ว่า 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.");
            }
        }
    });

แอปของคุณอาจพบเงื่อนไขที่ผิดปกติอย่างน้อย 1 ข้อเมื่อใช้วิธีการนี้

  • หากฟีเจอร์ยืนยันแอปเปิดอยู่แล้ว กล่องโต้ตอบจะไม่ปรากฏ และ API จะทำงานเสมือนว่าผู้ใช้ให้ความยินยอมในการเปิดใช้ฟีเจอร์นี้
  • หากผู้ใช้ออกจากกล่องโต้ตอบ ระบบจะปิดกล่องโต้ตอบนั้นและ API จะถือว่าผู้ใช้ไม่ได้ให้ความยินยอมในการเปิดใช้ฟีเจอร์นี้
  • หากแอปของคุณและแอปอื่นเรียกใช้เมธอดนี้พร้อมกัน จะมีเพียงกล่องโต้ตอบเดียวปรากฏขึ้น และแอปทั้งหมดจะได้รับผลลัพธ์ที่เหมือนกันจากเมธอด

แสดงรายการแอปที่ติดตั้งไว้ซึ่งอาจเป็นอันตราย

เมธอดแบบแอซิงโครนัส listHarmfulApps() ช่วยให้คุณดูรายการแอปที่อาจเป็นอันตรายซึ่งผู้ใช้ติดตั้งไว้ในอุปกรณ์ได้ รายการนี้ประกอบด้วยหมวดหมู่ของแอปที่อาจเป็นอันตรายซึ่งระบุไว้เพื่อให้แอปของคุณดำเนินการตามความเหมาะสม

ข้อมูลโค้ดต่อไปนี้แสดงวิธีสร้าง Callback ที่เชื่อมโยงกับเมธอดนี้

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