يعمل نظام التشغيل Android 7.0 في وضع Direct Boot الآمن عند تشغيل الجهاز بدون أن يفتح المستخدم قفله. ولتلبية هذه الحاجة، يقدّم النظام موقعَي تخزين للبيانات:
- مساحة التخزين المشفَّرة لبيانات الاعتماد، وهي موقع التخزين التلقائي ولا تتوفّر إلا بعد أن يفتح المستخدم قفل الجهاز.
- مساحة التخزين المشفَّرة على الجهاز، وهي موقع تخزين متاح أثناء "وضع التشغيل المباشر" وبعد أن يفتح المستخدم قفل الجهاز.
لا يتم تشغيل التطبيقات تلقائيًا أثناء وضع "التشغيل المباشر". إذا كان تطبيقك بحاجة إلى اتّخاذ إجراء أثناء وضع "التشغيل المباشر"، يمكنك تسجيل مكونات التطبيق ليتم تشغيلها أثناء هذا الوضع. تشمل بعض حالات الاستخدام الشائعة للتطبيقات التي تحتاج إلى التشغيل أثناء وضع "التشغيل المباشر" ما يلي:
- التطبيقات التي تُرسِل إشعارات مجدوَلة، مثل تطبيقات المنبّهات
- التطبيقات التي ترسل إشعارات مهمة للمستخدمين، مثل تطبيقات الرسائل القصيرة
- التطبيقات التي توفّر خدمات تسهيل الاستخدام، مثل TalkBack
إذا كان تطبيقك بحاجة إلى الوصول إلى البيانات أثناء تشغيله في وضع "التشغيل المباشر"، استخدِم مساحة التخزين المشفَّرة على الجهاز. يحتوي التخزين المشفَّر على الجهاز على بيانات مشفَّرة بمفتاح لا يتوفّر إلا بعد أن يُجري الجهاز عملية تشغيل مُثبَتة الهوية بنجاح.
بالنسبة إلى البيانات التي يجب تشفيرها باستخدام مفتاح مرتبط ببيانات اعتماد المستخدم، مثل رقم التعريف الشخصي أو كلمة المرور، استخدِم ميزة "التخزين المشفَّر لبيانات الاعتماد". يتوفّر التخزين المشفَّر لبيانات الاعتماد بعد أن يفتح المستخدم قفل الجهاز بنجاح وحتى يعيد تشغيله. إذا فعَّل العميل شاشة القفل بعد فتح قفل الجهاز، سيظل التخزين المشفَّر لبيانات الاعتماد متاحًا.
طلب الوصول إلى التشغيل أثناء ميزة "التشغيل المباشر"
يجب أن تسجِّل التطبيقات مكوّناتها في النظام قبل أن تتمكّن من تنفيذها أثناء وضع "التشغيل المباشر" أو الوصول إلى مساحة التخزين المشفَّرة على الجهاز. تسجّل التطبيقات نفسها في النظام من خلال وضع علامة على المكوّنات تفيد بأنّها
متوافقة مع التشفير. لوضع علامة على المكوّن بأنّه متوافق مع ميزة "التشفير"، اضبط سمة
android:directBootAware
على true في ملف البيان.
يمكن للمكونات المتوافقة مع التشفير التسجيل لتلقّي رسالة بث منACTION_LOCKED_BOOT_COMPLETED
النظام عند إعادة تشغيل الجهاز. في هذه المرحلة، يصبح التخزين المشفَّر للجهاز متاحًا، ويمكن للعنصر تنفيذ المهام التي يجب إكمالها أثناء وضع "التشغيل المباشر"، مثل تشغيل إنذار مجدوَل.
يعرض مقتطف الرمز البرمجي التالي مثالاً على كيفية تسجيل BroadcastReceiver
على أنّه عنصر على دراية بميزة التشفير، وإضافة 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()
. إنّ جميع طلبات واجهة برمجة التطبيقات
لمساحة التخزين التي يتم إجراؤها باستخدام هذا السياق تصل إلى مساحة التخزين المشفَّرة على الجهاز. يحصل المثال التالي على إذن بالوصول إلى مساحة التخزين المشفَّرة على الجهاز ويفتح ملف بيانات تطبيق حالي:
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...
استخدِم مساحة التخزين المشفَّرة على الجهاز فقط لملفاتك التي يجب أن يكون بالإمكان الوصول إليها أثناء وضع "التشغيل المباشر". لا تستخدِم مساحة التخزين المشفَّرة على الجهاز كمخزن مشفَّر للأغراض العامة. بالنسبة إلى معلومات المستخدم الخاصة أو البيانات المشفّرة غير المطلوبة أثناء وضع "التشغيل المباشر"، استخدِم مساحة التخزين المشفّرة لبيانات الاعتماد.
تلقّي إشعارات بشأن عمليات فتح الجهاز
عندما يفتح المستخدم قفل الجهاز بعد إعادة تشغيله، يمكن لتطبيقك التبديل إلى الوصول إلى مساحة التخزين المشفَّرة لبيانات الاعتماد واستخدام خدمات النظام العادية التي تعتمد على بيانات اعتماد المستخدم.
للحصول على إشعار عندما يفتح المستخدم قفل الجهاز بعد إعادة التشغيل،
سجِّل BroadcastReceiver
من مكوّن قيد التشغيل
للاستماع إلى رسائل إشعارات فتح القفل. عندما يفتح المستخدم قفل الجهاز
بعد التشغيل:
- إذا كان تطبيقك يتضمّن عمليات في المقدّمة تتطلّب إشعارًا فوريًا،
انتظر ظهور رسالة
ACTION_USER_UNLOCKED
. - إذا كان تطبيقك يستخدم فقط عمليات في الخلفية يمكنها معالجة إعلام متأخّر، انتظِر تلقّي الرسالة
ACTION_BOOT_COMPLETED
.
إذا فتح المستخدم قفل الجهاز، يمكنك معرفة ذلك من خلال الاتصال بالرقم UserManager.isUserUnlocked()
.
نقل البيانات الحالية
إذا عدّل أحد المستخدمين جهازه لاستخدام وضع "التشغيل المباشر"، قد يكون لديك
بيانات حالية يجب نقلها إلى مساحة التخزين المشفَّرة على الجهاز. استخدِم
Context.moveSharedPreferencesFrom()
و
Context.moveDatabaseFrom()
، مع السياق المقصود كمُستدعي الطريقة والسياق المصدر كوسيطة، لنقل بيانات الإعدادات المفضّلة وقاعدة بيانات
بين مساحة التخزين المشفَّرة للمصادقة ومساحة التخزين المشفَّرة للجهاز.
لا تنقل معلومات المستخدمين الخاصة، مثل كلمات المرور أو الرموز المميّزة لمنح الأذونات، من مساحة التخزين المشفَّرة للمستندات المُعتمَدة إلى مساحة التخزين المشفَّرة على الجهاز. استخدِم تقديرك الخاص عند تحديد البيانات الأخرى التي تريد نقلها إلى مساحة التخزين المشفَّرة على الجهاز. في بعض السيناريوهات، قد تحتاج إلى إدارة مجموعات منفصلة من البيانات في كلٍّ من المتجرَين المشفَّرَين.
اختبار تطبيقك المتوافق مع ميزة "التشفير من جهة العميل"
اختبِر تطبيقك المتوافق مع ميزة "التشفير" مع تفعيل وضع "التشغيل المباشر".
تفعِّل معظم الأجهزة التي تعمل بإصدارات Android حديثة وضع "التشغيل المباشر" عند ضبط بيانات اعتماد شاشة القفل (رقم التعريف الشخصي أو النقش أو كلمة المرور). وينطبق ذلك تحديدًا على جميع الأجهزة التي تستخدم التشفير المستند إلى الملفات. للتحقّق مما إذا كان الجهاز يستخدم التشفير المستند إلى الملفات، شغِّل الأمر التالي في shell:
adb shell getprop ro.crypto.type
إذا كانت النتيجة هي file
، يعني ذلك أنّ التشفير على مستوى الملفات مفعَّل على الجهاز.
على الأجهزة التي لا تستخدم التشفير المستند إلى الملفات تلقائيًا، قد تكون هناك خيارات أخرى لاختبار وضع "التشغيل المباشر":
-
يمكن تحويل بعض الأجهزة التي تستخدم ميزة "تشفير القرص بالكامل" (
ro.crypto.type=block
) وتعمل بالإصدار 7.0 من Android أو الإصدارات الأحدث إلى ميزة "التشفير المستند إلى الملفات". وهناك طريقتان لذلك:- على الجهاز، فعِّل خيارات المطوّر إذا لم يسبق لك تفعيلها، وذلك من خلال الانتقال إلى الإعدادات > لمحة عن الهاتف والنقر على رقم الإصدار سبع مرات. بعد ذلك، انتقِل إلى الإعدادات > خيارات المطوّرين واختَر التحويل إلى تشفير الملفات.
- بدلاً من ذلك، يمكنك تنفيذ أوامر shell التالية:
adb reboot-bootloader
fastboot --wipe-and-use-fbe
تحذير: تؤدي أي من طريقتَي التحويل إلى الترميز المستند إلى الملفات إلى محو جميع بيانات المستخدم على الجهاز.
-
تتيح الأجهزة التي تعمل بنظام التشغيل Android 13 أو الإصدارات الأقدم وضع التمهيد المباشر "المحاكي" الذي يستخدم أذونات الملفات لمحاكاة تأثيرات قفل الملفات المشفَّرة وفتح قفلها. لا تستخدِم الوضع المحاكي إلا أثناء التطوير، إذ يمكن أن يؤدي إلى فقدان البيانات. لتفعيل وضع التمهيد المباشر ، اضبط نمط قفل على الجهاز، واختَر "لا، شكرًا" إذا طُلب منك شاشة بدء تشغيل آمنة عند ضبط نمط القفل، ثم نفِّذ الأمر التالي في واجهة الأوامر:
adb shell sm set-emulate-fbe true
لإيقاف وضع "التشغيل المباشر" المحاكي، شغِّل الأمر التالي في واجهة الصعق:
adb shell sm set-emulate-fbe false
يؤدي تنفيذ أي من هذين الأمرَين إلى إعادة تشغيل الجهاز.
التحقّق من حالة التشفير في سياسة الجهاز
يمكن لتطبيقات إدارة الأجهزة استخدام DevicePolicyManager.getStorageEncryptionStatus()
للتحقق من حالة التشفير الحالية للجهاز.
إذا كان تطبيقك يستهدف مستوى واجهة برمجة تطبيقات أقل من Android 7.0 (المستوى 24)،
getStorageEncryptionStatus()
يعرض قيمة
ENCRYPTION_STATUS_ACTIVE
إذا كان الجهاز يستخدم إما تشفير القرص بالكامل
أو التشفير المستند إلى الملفات باستخدام ميزة "التشغيل المباشر". وفي كلتا الحالتَين، يتم تخزين البيانات
دائمًا مشفَّرة في حال عدم نقلها.
إذا كان تطبيقك يستهدف الإصدار 7.0 من Android (المستوى 24 من واجهة برمجة التطبيقات) أو إصدارًا أحدث، يعرض الرمز البرمجي
getStorageEncryptionStatus()
القيمة
ENCRYPTION_STATUS_ACTIVE
إذا كان الجهاز يستخدم تشفير القرص بالكامل. يتم عرض القيمة
ENCRYPTION_STATUS_ACTIVE_PER_USER
إذا كان الجهاز يستخدم التشفير المستند إلى الملفات
مع ميزة "التشغيل المباشر".
إذا كنت بصدد إنشاء تطبيق لإدارة الأجهزة
يستهدف الإصدار 7.0 من Android، احرص على التحقّق من كلٍّ من
ENCRYPTION_STATUS_ACTIVE
و
ENCRYPTION_STATUS_ACTIVE_PER_USER
لتحديد ما إذا كان الجهاز
مشفَّرًا.
عيّنات تعليمات برمجية إضافية
يوضّح نموذج DirectBoot أيضًا استخدام واجهات برمجة التطبيقات التي تتناولها هذه الصفحة.