SafetyNet Verify Apps API

‫SafetyNet Verify Apps API, ספרייה שמבוססת על השירותים של Google Play, מאפשר לאפליקציה שלכם ליצור אינטראקציה באופן פרוגרמטי עם התכונה אימות אפליקציות במכשיר, וכך להגן על המכשיר מפני אפליקציות שעלולות להזיק.

אם האפליקציה מטפלת בנתוני משתמש רגישים, כמו מידע פיננסי, חשוב לוודא שהמכשיר של המשתמש מוגן מפני אפליקציות זדוניות ואין בו אפליקציות שיכולות להתחזות לאפליקציה שלכם או לבצע פעולות זדוניות אחרות. אם האבטחה של המכשיר לא עומדת בדרישות המינימליות של רמת האבטחה, אפשר להשבית את הפונקציונליות באפליקציה כדי להפחית את הסכנה למשתמש.

כחלק מהמחויבות המתמשכת של Google להפוך את סביבת Android לבטוחה ככל האפשר, היא עוקבת אחרי ההתנהגות של אפליקציות Android ויוצרת פרופילים שלהן. אם התכונה 'אימות אפליקציות' מזהה אפליקציה שעלולה להיות מסוכנת, כל המשתמשים שהתקינו את האפליקציה מקבלים הודעה ומומלץ להם להסיר את האפליקציה בהקדם. התהליך הזה מגן על האבטחה והפרטיות של המשתמשים האלה.

‫SafetyNet Verify Apps API מאפשר לכם להשתמש בתכונה הזו כדי להגן על הנתונים של האפליקציה. באמצעות ה-API הזה, אפשר לקבוע אם המכשיר של המשתמש מוגן על ידי התכונה'אימות אפליקציות', לעודד משתמשים שלא משתמשים בתכונה להפעיל את ההגנה שלה, ולזהות אפליקציות מזיקות ידועות שמותקנות במכשיר.

תנאים והגבלות נוספים

קבלת גישה אל SafetyNet APIs או שימוש בהם מציינים את הסכמתכם לתנאים ולהגבלות של Google APIs ולתנאים ולהגבלות הבאים של Verify Apps API. כדי לקבל גישה אל ה-APIs, עליך לקרוא ולהבין את כל התנאים וההגבלות ותנאי המדיניות החלים.

התנאים וההגבלות של Verify Apps API

ניתוח האפליקציות שמזהה אפליקציות שעלולות להזיק עשוי להניב תוצאות חיוביות כוזבות ותוצאות שליליות כוזבות. התוצאות (או היעדרן) שמוחזרות מחבילת ה-API הזו מוצגות לפי מיטב הבנתנו. אתם מאשרים ומבינים שהתוצאות שמוחזרות על ידי חבילת SafetyNet API לא תמיד מדויקות.

הוספת התלות ב-SafetyNet API

לפני שמשתמשים ב-Verify Apps API, צריך להוסיף את SafetyNet API לפרויקט. אם משתמשים ב-Android Studio, צריך להוסיף את התלות הזו לקובץ Gradle ברמת האפליקציה. מידע נוסף זמין במאמר בנושא הגדרת SafetyNet API.

הפעלת אימות אפליקציות

‫SafetyNet Verify Apps API מספק שתי שיטות להפעלת התכונה 'אימות אפליקציות'. אפשר לקבוע אם אימות האפליקציה מופעל באמצעות isVerifyAppsEnabled(), ואפשר לבקש הפעלה של אימות האפליקציה באמצעות enableVerifyApps().

ההבדל בין שתי השיטות האלה הוא שבזמן ש-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.");
            }
        }
    });

יכול להיות שהאפליקציה שלכם תיתקל בתנאים חריגים אחד או יותר כשמשתמשים בשיטה הזו:

  • אם התכונה 'אימות אפליקציות' כבר מופעלת, תיבת הדו-שיח לא מופיעה וממשק ה-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.");
            }
        }
    });