תמיכה במצב הפעלה ישירה

‫Android 7.0 פועל במצב מאובטח של אתחול ישיר כשהמכשיר מופעל אבל המשתמש לא ביטל את הנעילה שלו. כדי לתמוך בכך, המערכת מספקת שני מיקומי אחסון לנתונים:

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

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

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

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

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

בקשה לקבל גישה להפעלה במהלך אתחול ישיר

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

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

קטע הקוד הבא הוא דוגמה לאופן הרישום של BroadcastReceiver כרכיב שמודע להצפנה, ולהוספה של מסנן Intent עבור ACTION_LOCKED_BOOT_COMPLETED במניפסט של האפליקציה:

<receiver
  android:directBootAware="true" >
  ...
  <intent-filter>
    <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
  </intent-filter>
</receiver>

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

גישה לאחסון המוצפן של המכשיר

כדי לגשת לאחסון מוצפן במכשיר, יוצרים מופע שני של Context על ידי קריאה ל-Context.createDeviceProtectedStorageContext(). כל הקריאות ל-Storage API שמתבצעות באמצעות הקשר הזה מקבלות גישה לאחסון המוצפן של המכשיר. בדוגמה הבאה יש גישה לאחסון המוצפן במכשיר ופתיחה של קובץ נתוני אפליקציה קיים:

Kotlin

val directBootContext: Context = appContext.createDeviceProtectedStorageContext()
// Access appDataFilename that lives in device encrypted storage
val inStream: InputStream = directBootContext.openFileInput(appDataFilename)
// Use inStream to read content...

Java

Context directBootContext = appContext.createDeviceProtectedStorageContext();
// Access appDataFilename that lives in device encrypted storage
FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
// Use inStream to read content...

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

קבלת התראה על פתיחת נעילה על ידי משתמש

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

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

  • אם לאפליקציה שלכם יש תהליכים שפועלים בחזית וצריכים לשלוח התראה מיידית, צריך להאזין להודעה ACTION_USER_UNLOCKED.
  • אם האפליקציה שלכם משתמשת רק בתהליכי רקע שיכולים לפעול על התראה מושהית, צריך להאזין להודעה ACTION_BOOT_COMPLETED.

אם המשתמש ביטל את נעילת המכשיר, אפשר לברר זאת באמצעות התקשרות אל UserManager.isUserUnlocked().

העברת נתונים קיימים

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

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

בדיקת אפליקציה עם מודעות להצפנה

בודקים את האפליקציה עם ההצפנה כשהמצב 'אתחול ישיר' מופעל.

ברוב המכשירים שפועלות בהם גרסאות עדכניות של Android, מצב האתחול הישיר מופעל בכל פעם שמוגדרים אמצעי גישה למסך הנעילה (קוד אימות, קו ביטול נעילה או סיסמה). הבעיה הזו מתרחשת בכל המכשירים שבהם נעשה שימוש בהצפנה מבוססת-קבצים. כדי לבדוק אם מכשיר משתמש בהצפנה מבוססת-קובץ, מריצים את פקודת ה-Shell הבאה:

adb shell getprop ro.crypto.type

אם הפלט הוא file, ההצפנה מבוססת-קבצים מופעלת במכשיר.

במכשירים שלא משתמשים בהצפנה מבוססת-קובץ כברירת מחדל, יכול להיות שיש אפשרויות אחרות לבדיקת מצב אתחול ישיר:

  • אפשר להמיר חלק מהמכשירים שמשתמשים בהצפנה מלאה של הדיסק (ro.crypto.type=block) ופועלים עם Android מגרסה 7.0 עד גרסה 12 להצפנה מבוססת-קבצים. ניתן לעשות זאת בשתי דרכים:

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

    • במכשיר, מפעילים את האפשרויות למפתחים אם עדיין לא עשיתם את זה. כדי לעשות את זה, עוברים אל הגדרות > מידע על הטלפון ומקישים על מספר Build שבע פעמים. אחר כך עוברים אל הגדרות > אפשרויות למפתחים ובוחרים באפשרות המרת ההצפנה להצפנת קבצים.
    • אפשר גם להריץ את פקודות ה-Shell הבאות:
      adb reboot-bootloader
      fastboot --wipe-and-use-fbe
      
  • במכשירים עם Android בגרסה 13 ומטה יש תמיכה במצב אתחול ישיר 'מדומה' שמשתמש בהרשאות קבצים כדי לדמות את ההשפעות של קבצים מוצפנים שננעלים ונפתחים. מומלץ להשתמש במצב הדמיה רק במהלך הפיתוח, כי הוא עלול לגרום לאובדן נתונים. כדי להפעיל מצב אמולציה של הפעלה ישירה, מגדירים קו ביטול נעילה במכשיר, בוחרים באפשרות 'לא, תודה' אם מוצגת בקשה למסך הפעלה מאובטח כשמגדירים קו ביטול נעילה, ואז מריצים את פקודת המעטפת הבאה:

    adb shell sm set-emulate-fbe true
    

    כדי להשבית את מצב האתחול הישיר באמולציה, מריצים את פקודת ה-shell הבאה:

    adb shell sm set-emulate-fbe false
    

    הפעלת אחת מהפקודות האלה גורמת להפעלה מחדש של המכשיר.

בדיקת סטטוס ההצפנה של מדיניות המכשיר

אפליקציות לניהול מכשירים יכולות להשתמש ב-DevicePolicyManager.getStorageEncryptionStatus() כדי לבדוק את סטטוס ההצפנה הנוכחי של המכשיר.

אם האפליקציה מטרגטת רמת API נמוכה מ-Android 7.0 ‏ (API 24), הפונקציה getStorageEncryptionStatus() מחזירה ENCRYPTION_STATUS_ACTIVE אם המכשיר משתמש בהצפנה מלאה של הדיסק או בהצפנה מבוססת-קובץ עם הפעלה ישירה. בשני המקרים האלה, הנתונים תמיד מאוחסנים כשהם מוצפנים במנוחה.

אם האפליקציה שלכם מטרגטת Android 7.0 ‏ (API 24) ואילך, ‫getStorageEncryptionStatus() מחזירה ‫ENCRYPTION_STATUS_ACTIVE אם המכשיר משתמש בהצפנה מלאה של הדיסק. הפונקציה מחזירה את הערך ENCRYPTION_STATUS_ACTIVE_PER_USER אם המכשיר משתמש בהצפנה מבוססת-קבצים עם הפעלה ישירה.

אם אתם מפתחים אפליקציה לניהול מכשירים שמיועדת ל-Android 7.0, הקפידו לבדוק את ENCRYPTION_STATUS_ACTIVE ואת ENCRYPTION_STATUS_ACTIVE_PER_USER כדי לקבוע אם המכשיר מוצפן.

דוגמאות קוד נוספות

בדוגמה של DirectBoot מוצג שימוש נוסף בממשקי ה-API שמוסבר עליהם בדף הזה.