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

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

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

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

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

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

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

בקשה לקבל גישה להפעלה במהלך Direct Boot

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

רכיבים שמודעים להצפנה יכולים להירשם לקבלת הודעת שידור ACTION_LOCKED_BOOT_COMPLETED מהמערכת כשהמכשיר מופעל מחדש. בשלב הזה, אחסון Device Encrypted‏ (DE) זמין, והרכיב יכול לבצע משימות שצריך להריץ במהלך מצב 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>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

adb shell getprop ro.crypto.type

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

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

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

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

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

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