پشتیبانی از حالت «راه‌اندازی مستقیم»

وقتی دستگاه روشن شده است اما کاربر قفل دستگاه را باز نکرده است، Android 7.0 در حالت امن راه‌اندازی مستقیم اجرا می‌شود. برای پشتیبانی از این موضوع، سیستم دو مکان ذخیره‌سازی برای داده‌ها ارائه می‌دهد:

  • فضای ذخیره‌سازی رمزگذاری‌شده اعتبارنامه که مکان ذخیره‌سازی پیش‌فرض است و فقط پس‌از باز کردن قفل دستگاه توسط کاربر دردسترس است.
  • فضای ذخیره‌سازی رمزگذاری‌شده دستگاه، که مکان ذخیره‌سازی‌ای است که هم درطول حالت «راه‌اندازی مستقیم» و هم پس‌از باز کردن قفل دستگاه توسط کاربر دردسترس است.

به‌طور پیش‌فرض، برنامه‌ها درحین حالت «راه‌اندازی مستقیم» اجرا نمی‌شوند. اگر برنامه‌تان باید درطول حالت «راه‌اندازی مستقیم» اقدام کند، می‌توانید مؤلفه‌های برنامه را ثبت کنید تا درطول این حالت اجرا شوند. برخی‌از موارد استفاده رایج برای برنامه‌هایی که باید درحین حالت «راه‌اندازی مستقیم» اجرا شوند عبارت‌اند از:

  • برنامه‌هایی که اعلان‌های زمان‌بندی‌شده دارند، مثل برنامه‌های ساعت زنگ‌دار.
  • برنامه‌هایی که اعلان‌های مهم کاربر را ارائه می‌دهند، مثل برنامه‌های پیامک.
  • برنامه‌هایی که خدمات دسترس‌پذیری ارائه می‌دهند، مثل 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.createDeviceProtectedStorageContext()، نمونه Context دومی ایجاد کنید. همه تماس‌های API فضای ذخیره‌سازی که بااستفاده از این بافت انجام می‌شود به فضای ذخیره‌سازی رمزگذاری‌شده دستگاه دسترسی دارد. مثال زیر به فضای ذخیره‌سازی رمزگذاری‌شده دستگاه دسترسی پیدا می‌کند و فایل داده‌های برنامه موجود را باز می‌کند:

کاتلین

val directBootContext: Context = appContext.createDeviceProtectedStorageContext()
// Access appDataFilename that lives in device encrypted storage
val inStream: InputStream = directBootContext.openFileInput(appDataFilename)
// Use inStream to read content...

جاوا

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 را اجرا می‌کنند، هروقت اطلاعات کاربری صفحه قفل (پین، الگو، یا گذرواژه) تنظیم شده باشد، حالت «راه‌اندازی مستقیم» را فعال می‌کنند. به‌طور دقیق، این مورد در همه دستگاه‌هایی که از رمزگذاری مبتنی بر فایل استفاده می‌کنند وجود دارد. برای بررسی اینکه دستگاهی از رمزگذاری مبتنی بر فایل استفاده می‌کند یا نه، فرمان پوسته زیر را اجرا کنید:

adb shell getprop ro.crypto.type

اگر خروجی file باشد، رمزگذاری فایل‌مبنا در دستگاه فعال است.

در دستگاه‌هایی که به‌طور پیش‌فرض از رمزگذاری فایل‌مبنا استفاده نمی‌کنند، ممکن است گزینه‌های دیگری برای آزمایش حالت «راه‌اندازی مستقیم» وجود داشته باشد:

  • برخی‌از دستگاه‌هایی که از رمزگذاری کامل دیسک (ro.crypto.type=block) استفاده می‌کنند و Android 7.0 تا Android 12 را اجرا می‌کنند می‌توانند به رمزگذاری مبتنی بر فایل تبدیل شوند. دو روش برای انجام این کار وجود دارد:

      هشدار: هریک از روش‌های تبدیل به رمزگذاری مبتنی بر فایل، همه داده‌های کاربر را در دستگاه پاک می‌کند.

    • اگر قبلاً گزینه‌های توسعه‌دهندگان را در دستگاه فعال نکرده‌اید، با رفتن به تنظیمات > درباره تلفن و هفت بار ضربه زدن روی شماره ساخت، آن را فعال کنید. سپس به تنظیمات > گزینه‌های توسعه‌دهنده بروید و تبدیل به رمزگذاری فایل را انتخاب کنید.
    • یا فرمان‌های پوسته زیر را اجرا کنید:
      adb reboot-bootloader
      fastboot --wipe-and-use-fbe
      
  • دستگاه‌های دارای Android نسخه ۱۳ یا پایین‌تر از حالت «شبیه‌سازی‌شده» «راه‌اندازی مستقیم» پشتیبانی می‌کنند که از اجازه‌های فایل برای شبیه‌سازی تأثیرات قفل شدن و باز شدن قفل فایل‌های رمزگذاری‌شده استفاده می‌کند. فقط درطول توسعه از حالت شبیه‌سازی‌شده استفاده کنید؛ این کار می‌تواند باعث ازدست رفتن داده‌ها شود. برای فعال کردن حالت «راه‌اندازی مستقیم» شبیه‌سازی‌شده، الگوی قفلی در دستگاه تنظیم کنید، اگر هنگام تنظیم الگوی قفل از شما خواسته شد صفحه راه‌اندازی ایمن را انتخاب کنید، «نه، متشکرم» را انتخاب کنید، و سپس فرمان پوسته زیر را اجرا کنید:

    adb shell sm set-emulate-fbe true
    

    برای خاموش کردن حالت «راه‌اندازی مستقیم» شبیه‌سازی‌شده، فرمان پوسته زیر را اجرا کنید:

    adb shell sm set-emulate-fbe false
    

    اجرای هرکدام از این فرمان‌ها باعث بازراه‌اندازی دستگاه می‌شود.

بررسی وضعیت رمزگذاری خط‌مشی دستگاه

برنامه‌های مدیریت دستگاه می‌توانند از DevicePolicyManager.getStorageEncryptionStatus() برای بررسی وضعیت رمزگذاری فعلی دستگاه استفاده کنند.

اگر برنامه شما سطح میانای برنامه‌سازی کاربردی پایین‌تر از Android 7.0 (میانای برنامه‌سازی کاربردی ۲۴) را هدف قرار دهد، getStorageEncryptionStatus() برمی‌گرداند ENCRYPTION_STATUS_ACTIVE اگر دستگاه از رمزگذاری کامل دیسک یا رمزگذاری مبتنی بر فایل با «راه‌اندازی مستقیم» استفاده کند. در هر دو مورد، داده‌ها همیشه به‌صورت رمزگذاری‌شده در حالت سکون ذخیره می‌شوند.

اگر برنامه شما Android 7.0 (میانای برنامه‌سازی کاربردی ۲۴) یا بالاتر را هدف قرار می‌دهد، getStorageEncryptionStatus() برمی‌گرداند ENCRYPTION_STATUS_ACTIVE اگر دستگاه از رمزگذاری کامل دیسک استفاده می‌کند. اگر دستگاه از رمزگذاری مبتنی بر فایل با «راه‌اندازی مستقیم» استفاده کند، ENCRYPTION_STATUS_ACTIVE_PER_USER را برمی‌گرداند.

اگر برنامه مدیریت دستگاهی می‌سازید که Android نسخه ۷.۰ را هدف قرار می‌دهد، حتماً هم ENCRYPTION_STATUS_ACTIVE و هم ENCRYPTION_STATUS_ACTIVE_PER_USER را بررسی کنید تا مشخص شود دستگاه رمزگذاری شده است یا نه.

نمونه‌های کد اضافی

نمونه DirectBoot استفاده از میاناهای برنامه‌سازی کاربردی پوشش‌داده‌شده در این صفحه را بیشتر نشان می‌دهد.