SafetyNet Verify Apps API

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

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

כחלק מהמחויבות המתמשכת שלה להפוך את הסביבה העסקית של Android לבטוחה ככל האפשר, Google מנטרת את ההתנהגות של אפליקציות ל-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, צריך להוסיף את יחסי התלות האלה לקובץ Gradle ברמת האפליקציה. למידע נוסף, תוכלו לקרוא את המאמר הגדרת SafetyNet API.

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

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

ההבדל בין שתי השיטות הוא ש-isVerifyAppsEnabled() מדווחת על הסטטוס הנוכחי של התכונה 'אימות אפליקציות', ואילו enableVerifyApps() מבקשת מהמשתמש באופן מפורש הסכמה לשימוש בתכונה. אם רוצים שהאפליקציה תהיה מודעת רק לסטטוס של התכונה כדי לקבל החלטה שמבוססת על אבטחה, צריך להתקשר לאפליקציה isVerifyAppsEnabled(). עם זאת, אם אתם רוצים לוודא שהאפליקציה שלכם תוכל להציג רשימה של אפליקציות מותקנות שעלולות להזיק, עליכם לבצע קריאה ל-enableVerifyApps() במקום זאת.

איך בודקים אם האפשרות של אימות אפליקציות מופעלת

השיטה האסינכרונית isVerifyAppsEnabled() מאפשרת לאפליקציה לקבוע אם המשתמש רשום לתכונה 'אימות אפליקציות'. השיטה הזו מחזירה אובייקט VerifyAppsUserResponse שמכיל מידע על כל הפעולות שהמשתמש ביצע שקשורות לתכונה 'אימות אפליקציות', כולל הפעלתה.

קטע הקוד הבא מראה איך ליצור את פונקציית ה-callback שמשויכת לשיטה הזו:

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 שמכיל מידע על כל הפעולות שהמשתמש ביצע שקשורות לתכונה 'אימות אפליקציות', כולל אם הוא נתן הסכמה להפעלת התכונה.

קטע הקוד הבא מראה איך יוצרים את פונקציית ה-callback שמשויכת לשיטה הזו:

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() מאפשרת לקבל רשימה של אפליקציות ידועות שעלולות להזיק (PHA) שהמשתמש התקין במכשיר. הרשימה הזו כוללת קטגוריות של האפליקציות שזוהו כמזיקות פוטנציאליות, כדי שתוכלו לנקוט את הפעולה המתאימה באפליקציה.

קטע הקוד הבא מראה איך יוצרים את פונקציית ה-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.");
            }
        }
    });