SafetyNet Uygulama Doğrulama API'si

Google Play Hizmetleri tarafından desteklenen bir kitaplık olan SafetyNet Uygulama Doğrulama API'si, uygulamanızın cihazdaki Uygulama Doğrulama özelliğiyle programatik olarak etkileşime geçmesine olanak tanıyarak cihazı potansiyel olarak zararlı uygulamalara karşı korur.

Uygulamanız finansal bilgiler gibi hassas kullanıcı verilerini işliyorsa kullanıcının cihazının kötü amaçlı uygulamalara karşı korunduğunu ve uygulamanızın kimliğine bürünebilecek veya başka kötü amaçlı işlemler gerçekleştirebilecek uygulamalar içermediğini doğrulamanız önemlidir. Cihazın güvenliği minimum güvenlik duruşunu karşılamıyorsa kullanıcıya yönelik tehlikeyi azaltmak için kendi uygulamanızdaki işlevleri devre dışı bırakabilirsiniz.

Google, Android ekosistemini mümkün olduğunca güvenli hale getirme taahhüdü kapsamında Android uygulamalarının davranışlarını izler ve profillerini oluşturur. Uygulama Doğrulama özelliği potansiyel olarak tehlikeli bir uygulama tespit ederse uygulamayı yükleyen tüm kullanıcılar bilgilendirilir ve uygulamayı derhal kaldırmaları istenir. Bu işlem, söz konusu kullanıcıların güvenliğini ve gizliliğini korur.

SafetyNet Verify Apps API, uygulamanızın verilerini korumak için bu özellikten yararlanmanıza olanak tanır. Bu API'yi kullanarak kullanıcının cihazının Uygulama Doğrulama özelliğiyle korunup korunmadığını belirleyebilir, bu özelliği henüz kullanmayan kullanıcıları korumadan yararlanmaya teşvik edebilir ve cihaza yüklenmiş bilinen potansiyel zararlı uygulamaları tanımlayabilirsiniz.

Ek hizmet şartları

SafetyNet API'lerine erişerek veya bunları kullanarak Google API'leri Hizmet Şartları'nı ve aşağıdaki Verify Apps API Hizmet Şartları'nı kabul etmiş olursunuz. Lütfen API'lere erişmeden önce geçerli tüm şartları ve politikaları okuyup anlayın.

Uygulama Doğrulama API'si Hizmet Şartları

Zararlı olabilecek uygulamaları belirleyen uygulamaların analizleri hem yanlış pozitif hem de yanlış negatif sonuçlar verebilir. Bu API paketinden döndürülen sonuçlar (veya sonuçların olmaması) anladığımız kadarıyla sunulmaktadır. Bu SafetyNet API paketi tarafından döndürülen sonuçların her zaman doğru olacağının garanti edilmediğini kabul eder ve anlarsınız.

SafetyNet API bağımlılığını ekleyin

Uygulamaları Doğrulama API'sini kullanmadan önce projenize SafetyNet API'yi ekleyin. Android Studio kullanıyorsanız bu bağımlılığı uygulama düzeyindeki Gradle dosyanıza ekleyin. Daha fazla bilgi için SafetyNet API kurulumu başlıklı makaleyi inceleyin.

Uygulama doğrulamayı etkinleştirme

SafetyNet Verify Apps API, Uygulamaları Doğrula özelliğini etkinleştirmek için iki yöntem sunar. Uygulama doğrulamanın etkin olup olmadığını isVerifyAppsEnabled() kullanarak belirleyebilir ve uygulama doğrulamanın etkinleştirilmesini enableVerifyApps() kullanarak isteyebilirsiniz.

Bu iki yöntem arasındaki fark, isVerifyAppsEnabled() uygulamasının Uygulamaları Doğrula özelliğinin mevcut durumunu bildirmesine karşın, enableVerifyApps() uygulamasının özelliği kullanmak için kullanıcıdan açıkça izin istemesidir. Uygulamanızın, güvenliğe dayalı bir karar vermek için yalnızca özelliğin durumunu bilmesini istiyorsanız uygulamanız isVerifyAppsEnabled() işlevini çağırmalıdır. Ancak, uygulamanızın zararlı olabilecek yüklü uygulamaları listeleyebildiğinden emin olmak istiyorsanız bunun yerine enableVerifyApps() yöntemini çağırmanız gerekir.

Uygulama doğrulamanın etkin olup olmadığını belirleme

Asenkron isVerifyAppsEnabled() yöntemi, uygulamanızın kullanıcının Uygulamaları Doğrula özelliğine kayıtlı olup olmadığını belirlemesine olanak tanır. Bu yöntem, kullanıcının Uygulamaları Doğrula özelliğiyle ilgili gerçekleştirdiği tüm işlemler (özelliği etkinleştirme dahil) hakkında bilgi içeren bir VerifyAppsUserResponse nesnesi döndürür.

Aşağıdaki kod snippet'inde, bu yöntemle ilişkili geri çağırma işlevinin nasıl oluşturulacağı gösterilmektedir:

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

Uygulama doğrulamanın etkinleştirilmesini isteme

Asenkron enableVerifyApps() yöntemi, uygulamanızın kullanıcıdan Uygulamaları Doğrula özelliğini etkinleştirmesini isteyen bir iletişim kutusu isteği çağırmasına olanak tanır. Bu yöntem, kullanıcının Uygulamaları Doğrula özelliğiyle ilgili yaptığı tüm işlemler hakkında bilgi içeren bir VerifyAppsUserResponse nesnesi döndürür. Bu işlemler arasında, kullanıcının özelliği etkinleştirmek için izin verip vermediği de yer alır.

Aşağıdaki kod snippet'inde, bu yöntemle ilişkili geri çağırma işlevinin nasıl oluşturulacağı gösterilmektedir:

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

Uygulamanız bu yöntemi kullanırken bir veya daha fazla olağan dışı durumla karşılaşabilir:

  • Uygulamaları Doğrula özelliği zaten etkinleştirilmişse iletişim kutusu gösterilmez ve API, kullanıcı bu özelliği etkinleştirmek için izin vermiş gibi davranır.
  • Kullanıcı iletişim kutusundan uzaklaşırsa iletişim kutusu yok edilir ve API, kullanıcının bu özelliği etkinleştirmek için izin vermediğini varsayar.
  • Uygulamanız ve başka bir uygulama bu yöntemi aynı anda çağırırsa yalnızca bir iletişim kutusu görünür ve tüm uygulamalar yöntemden aynı dönüş değerlerini alır.

Yüklü zararlı olabilecek uygulamaları listeleme

Asenkron listHarmfulApps() yöntemi, kullanıcının cihazına yüklediği bilinen ve potansiyel olarak zararlı uygulamaların listesini almanıza olanak tanır. Bu listede, uygulamanızın uygun işlemi yapabilmesi için tanımlanan potansiyel zararlı uygulamaların kategorileri yer alır.

Aşağıdaki kod snippet'inde, bu yöntemle ilişkili geri çağırma işlevinin nasıl oluşturulacağı gösterilmektedir:

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