Android 7.0 פועל במצב מאובטח של Direct Boot כשהמכשיר מופעל אבל המשתמש לא פתח את נעילת המכשיר. כדי לתמוך בכך, המערכת מספקת שני מיקומי אחסון לנתונים:
- אחסון Credential Encrypted (CE), מיקום האחסון שמוגדר כברירת מחדל וזמין רק אחרי שהמשתמש פותח את נעילת המכשיר.
- אחסון Device Encrypted (DE), מיקום אחסון שזמין גם במצב Direct Boot וגם אחרי שהמשתמש פותח את נעילת המכשיר.
כברירת מחדל, אפליקציות לא פועלות במצב Direct Boot. אם האפליקציה צריכה לבצע פעולה כלשהי במהלך מצב האתחול הישיר, אפשר לרשום רכיבי אפליקציה להרצה במהלך המצב הזה. דוגמאות לתרחישי שימוש נפוצים באפליקציות שצריכות לפעול במהלך מצב האתחול הישיר:
- אפליקציות שכוללות התראות מתוזמנות, כמו אפליקציות של שעון מעורר.
- אפליקציות שמספקות התראות חשובות למשתמשים, כמו אפליקציות SMS.
- אפליקציות שמספקות שירותי נגישות, כמו TalkBack.
אם האפליקציה שלכם צריכה לגשת לנתונים בזמן שהיא פועלת במצב Direct Boot, צריך להשתמש באחסון מוצפן במכשיר. אחסון Device Encrypted מכיל נתונים מוצפנים עם מפתח שזמין רק אחרי שהמכשיר מבצע אתחול מאומת מוצלח.
לנתונים שצריך להצפין באמצעות מפתח שמשויך לפרטי הכניסה של המשתמש, כמו קוד אימות או סיסמה, צריך להשתמש באחסון מוצפן של פרטי הכניסה. אחסון Credential Encrypted זמין אחרי שהמשתמש פותח את נעילת המכשיר ועד שהוא מפעיל אותו מחדש. אם המשתמש מפעיל את מסך הנעילה אחרי שהוא פותח את נעילת המכשיר, אחסון פרטי הכניסה המוצפנים נשאר זמין.
בקשה לקבל גישה להפעלה במהלך אתחול ישיר
אפליקציות צריכות לרשום את הרכיבים שלהן במערכת לפני שהן יכולות לפעול במצב הפעלה ישירה או לגשת לאחסון מוצפן במכשיר. האפליקציות נרשמות במערכת על ידי סימון רכיבים כמודעים להצפנה. כדי לסמן את הרכיב כרכיב שמודע להצפנה, מגדירים את המאפיין 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. אל תשתמשו באחסון מוצפן במכשיר כמאגר מוצפן לשימוש כללי. לגבי מידע פרטי של משתמשים או נתונים מוצפנים שלא נדרשים במהלך מצב 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-bootloaderfastboot --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 שמוסברים בדף הזה.