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

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

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

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

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

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

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

בקשת גישה להרצה במהלך הפעלה ישירה

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

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

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

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

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

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

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

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

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

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

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

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

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

בדיקת האפליקציה עם הרשאת ההצפנה

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

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

adb shell getprop ro.crypto.type

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

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

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

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

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

    adb shell sm set-emulate-fbe true
    

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

    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 שמפורטים בדף הזה.