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

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

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