SafetyNet Verify Apps API

SafetyNet Verify Apps API, library yang didukung oleh layanan Google Play, memungkinkan aplikasi Anda berinteraksi secara terprogram dengan fitur Verifikasi Aplikasi di perangkat, yang melindungi perangkat dari aplikasi yang berpotensi membahayakan (PHA).

Jika aplikasi Anda menangani data pengguna yang sensitif, seperti informasi keuangan, penting untuk memastikan bahwa perangkat pengguna dilindungi dari aplikasi berbahaya dan tidak memiliki aplikasi yang dapat meniru identitas aplikasi Anda atau melakukan tindakan berbahaya. Jika keamanan perangkat tidak memenuhi postur keamanan minimum, Anda dapat menonaktifkan fungsi dalam aplikasi Anda sendiri untuk mengurangi bahaya bagi pengguna.

Sebagai bagian dari komitmen berkelanjutan untuk menjadikan ekosistem Android seaman mungkin, Google memantau dan membuat profil perilaku aplikasi Android. Jika fitur Verifikasi Aplikasi mendeteksi aplikasi yang berpotensi membahayakan, semua pengguna yang telah menginstal aplikasi tersebut akan diberi tahu dan disarankan untuk segera meng-uninstal aplikasi. Proses ini melindungi keamanan dan privasi pengguna tersebut.

SafetyNet Verify Apps API memungkinkan Anda memanfaatkan fitur ini untuk melindungi data aplikasi. Dengan API ini, Anda dapat menentukan apakah perangkat pengguna dilindungi oleh fitur Verifikasi Aplikasi, mendorong pengguna yang belum menggunakan fitur ini untuk mengaktifkan perlindungannya, dan mengidentifikasi aplikasi umum apa pun yang berpotensi membahayakan yang terinstal di perangkat.

Persyaratan layanan tambahan

Dengan mengakses atau menggunakan SafetyNet API, Anda menyetujui Persyaratan Layanan Google API dan Persyaratan Layanan Verify Apps API berikut. Harap baca dan pahami semua persyaratan dan kebijakan yang berlaku sebelum mengakses API.

Persyaratan Layanan Verify Apps API

Analisis aplikasi yang mengidentifikasi aplikasi yang berpotensi membahayakan.(PHA) dapat menghasilkan positif palsu (PP) maupun negatif palsu (NP). Hasil (atau ketiadaan hasil) dari rangkaian API ini disajikan sesuai dengan pemahaman terbaik kami. Anda menerima dan memahami bahwa hasil yang ditampilkan oleh rangkaian SafetyNet API ini tidak dijamin akurat sepanjang waktu.

Menambahkan dependensi SafetyNet API

Sebelum menggunakan Verify Apps API, tambahkan SafetyNet API ke project Anda. Jika Anda menggunakan Android Studio, tambahkan dependensi ini ke file Gradle level aplikasi. Untuk mengetahui informasi selengkapnya, lihat Penyiapan SafetyNet API.

Mengaktifkan verifikasi aplikasi

SafetyNet Verify Apps API menyediakan dua metode untuk mengaktifkan fitur Verifikasi Aplikasi. Anda dapat menentukan apakah verifikasi aplikasi diaktifkan atau tidak menggunakan isVerifyAppsEnabled(), dan Anda dapat meminta pengaktifan verifikasi aplikasi menggunakan enableVerifyApps().

Perbedaan antara kedua metode ini adalah selagi isVerifyAppsEnabled() melaporkan status saat ini dari fitur Verifikasi Aplikasi, enableVerifyApps() secara eksplisit meminta persetujuan pengguna untuk menggunakan fitur tersebut. Jika Anda ingin aplikasi Anda sekadar mengenali status fitur ini untuk membuat keputusan yang didasarkan pada keamanan, sebaiknya aplikasi Anda memanggil isVerifyAppsEnabled(). Namun, jika Anda ingin memastikan bahwa aplikasi dapat mencantumkan aplikasi terinstal yang berpotensi membahayakan, sebaiknya panggil enableVerifyApps().

Menentukan apakah verifikasi aplikasi diaktifkan atau tidak

Metode isVerifyAppsEnabled() asinkron memungkinkan aplikasi Anda menentukan apakah pengguna terdaftar dalam fitur Verifikasi Aplikasi atau tidak. Metode ini menampilkan objek VerifyAppsUserResponse, yang berisi informasi mengenai semua tindakan yang telah diambil pengguna terkait dengan fitur Verifikasi Aplikasi, termasuk mengaktifkannya.

Cuplikan kode berikut menunjukkan cara membuat callback yang terkait dengan metode ini:

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

Meminta pengaktifan verifikasi aplikasi

Metode enableVerifyApps() asinkron memungkinkan aplikasi Anda memanggil dialog yang meminta pengguna mengaktifkan fitur Verifikasi Aplikasi. Metode ini menampilkan objek VerifyAppsUserResponse yang berisi informasi mengenai semua tindakan yang telah diambil pengguna terkait dengan fitur Verifikasi Aplikasi, termasuk apakah mereka telah memberikan izin untuk mengaktifkannya.

Cuplikan kode berikut menunjukkan cara membuat callback yang terkait dengan metode ini:

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

Aplikasi Anda mungkin mengalami satu atau beberapa kondisi yang tidak biasa saat menggunakan metode ini:

  • Jika fitur Verifikasi Aplikasi sudah diaktifkan, dialog tidak ditampilkan, dan API berperilaku seolah-olah pengguna memberikan izin untuk mengaktifkan fitur ini.
  • Jika pengguna menutup dialog, dialog dihapus, dan API berasumsi bahwa pengguna tidak memberikan izin untuk mengaktifkan fitur ini.
  • Jika aplikasi Anda dan aplikasi lain memanggil metode ini secara bersamaan, hanya satu dialog yang ditampilkan, dan semua aplikasi menerima nilai return yang identik dari metode.

Membuat daftar aplikasi terinstal yang berpotensi membahayakan

Metode listHarmfulApps() asinkron memungkinkan Anda mendapatkan daftar aplikasi umum yang berpotensi membahayakan, yang telah diinstal pengguna di perangkatnya. Daftar ini mencakup kategori untuk aplikasi yang berpotensi membahayakan (PHA) yang telah diidentifikasi sehingga aplikasi Anda dapat mengambil tindakan yang tepat.

Cuplikan kode berikut menunjukkan cara membuat callback yang terkait dengan metode ini:

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