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

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

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

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

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

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

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

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

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