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