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

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

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

כברירת מחדל, אפליקציות לא פועלות במצב 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(). כל הקריאות ל-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...

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

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

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

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

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

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

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

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

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

בדיקת האפליקציה שתומכת בהצפנה

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

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

adb shell getprop ro.crypto.type

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

במכשירים שלא משתמשים בהצפנה המבוססת על קבצים (FBE) כברירת מחדל, יכול להיות שיהיו אפשרויות אחרות לבדיקת מצב Direct Boot:

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

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

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

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

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

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

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

הדוגמה DirectBoot ממחישה את השימוש בממשקי ה-API שמתוארים בדף הזה.