डायरेक्ट बूट मोड के साथ काम करना

Android 7.0, सुरक्षित डायरेक्ट बूट मोड में काम करता है. ऐसा तब होता है, जब डिवाइस चालू हो, लेकिन उपयोगकर्ता ने डिवाइस को अनलॉक न किया हो. इसके लिए, सिस्टम में डेटा के लिए दो स्टोरेज लोकेशन उपलब्ध हैं:

  • क्रेडेंशियल का एन्क्रिप्ट (सुरक्षित) किया गया स्टोरेज, जो स्टोरेज की डिफ़ॉल्ट जगह है और सिर्फ़ डिवाइस के अनलॉक होने के बाद उपलब्ध होता है.
  • डिवाइस का एन्क्रिप्ट (सुरक्षित) किया गया स्टोरेज, जो स्टोरेज की वह जगह होती है जो डायरेक्ट बूट मोड के दौरान और उपयोगकर्ता की ओर से डिवाइस को अनलॉक करने के बाद उपलब्ध होती है.

डिफ़ॉल्ट रूप से, डायरेक्ट बूट मोड के दौरान ऐप्लिकेशन नहीं चलते. अगर आपके ऐप्लिकेशन को डायरेक्ट बूट मोड के दौरान कोई कार्रवाई करनी है, तो इस मोड के दौरान चलने के लिए ऐप्लिकेशन के कॉम्पोनेंट रजिस्टर किए जा सकते हैं. डायरेक्ट बूट मोड के दौरान चलने वाले ऐप्लिकेशन के इस्तेमाल के कुछ सामान्य उदाहरणों में ये शामिल हैं:

  • वे ऐप्लिकेशन जिनमें सूचनाएं शेड्यूल की गई हैं, जैसे कि अलार्म घड़ी वाले ऐप्लिकेशन.
  • ऐसे ऐप्लिकेशन जो उपयोगकर्ताओं को ज़रूरी सूचनाएं देते हैं. जैसे, एसएमएस ऐप्लिकेशन.
  • TalkBack जैसी सुलभता सेवाएं देने वाले ऐप्लिकेशन.

अगर आपके ऐप्लिकेशन को डायरेक्ट बूट मोड में चलने के दौरान डेटा ऐक्सेस करना है, तो डिवाइस के एन्क्रिप्ट किए गए स्टोरेज का इस्तेमाल करें. डिवाइस के एन्क्रिप्ट किए गए स्टोरेज में, ऐसी कुंजी से एन्क्रिप्ट किया गया डेटा होता है जो सिर्फ़ तब उपलब्ध होती है, जब डिवाइस पर वेरिफ़ाइड बूट की प्रोसेस पूरी हो गई हो.

जिस डेटा को उपयोगकर्ता क्रेडेंशियल से जुड़ी कुंजी से एन्क्रिप्ट (सुरक्षित) किया जाना ज़रूरी है उसके लिए, जैसे कि पिन या पासवर्ड, क्रेडेंशियल एन्क्रिप्ट (सुरक्षित) किए गए स्टोरेज का इस्तेमाल करें. उपयोगकर्ता के डिवाइस को अनलॉक करने के बाद, क्रेडेंशियल का एन्क्रिप्ट किया गया स्टोरेज उपलब्ध होता है. यह तब तक उपलब्ध रहता है, जब तक उपयोगकर्ता डिवाइस को रीस्टार्ट नहीं कर देता. अगर उपयोगकर्ता डिवाइस अनलॉक करने के बाद लॉक स्क्रीन चालू करता है, तो क्रेडेंशियल का एन्क्रिप्ट किया गया स्टोरेज उपलब्ध रहता है.

डायरेक्ट बूट के दौरान ऐप्लिकेशन चलाने के लिए ऐक्सेस का अनुरोध करना

ऐप्लिकेशन को डायरेक्ट बूट मोड में चलने या डिवाइस के एन्क्रिप्ट किए गए स्टोरेज को ऐक्सेस करने से पहले, अपने कॉम्पोनेंट को सिस्टम के साथ रजिस्टर करना होगा. ऐप्लिकेशन, कॉम्पोनेंट को एन्क्रिप्शन अवेयर के तौर पर मार्क करके, सिस्टम के साथ रजिस्टर करते हैं. अपने कॉम्पोनेंट को एन्क्रिप्ट (सुरक्षित) करने के तरीके के तौर पर मार्क करने के लिए, अपनी मेनिफ़ेस्ट फ़ाइल में android:directBootAware एट्रिब्यूट को 'सही' पर सेट करें.

एन्क्रिप्शन के बारे में जानकारी रखने वाले कॉम्पोनेंट, डिवाइस के फिर से चालू होने पर, सिस्टम से 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 इंस्टेंस बनाएं. इस कॉन्टेक्स्ट का इस्तेमाल करके किए गए सभी स्टोरेज एपीआई कॉल, डिवाइस के एन्क्रिप्ट किए गए स्टोरेज को ऐक्सेस करते हैं. यहां दिए गए उदाहरण में, डिवाइस के एन्क्रिप्ट किए गए स्टोरेज को ऐक्सेस किया गया है और ऐप्लिकेशन की मौजूदा डेटा फ़ाइल को खोला गया है:

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 के नए वर्शन पर काम करने वाले ज़्यादातर डिवाइसों में, लॉकस्क्रीन पर क्रेडेंशियल (पिन, पैटर्न या पासवर्ड) सेट करने पर, डायरेक्ट बूट मोड चालू हो जाता है. खास तौर पर, यह उन सभी डिवाइसों पर लागू होता है जिनमें फ़ाइल को एन्क्रिप्ट (सुरक्षित) करने का तरीका इस्तेमाल किया जाता है. यह देखने के लिए कि डिवाइस में फ़ाइल एन्क्रिप्ट (सुरक्षित) करने का तरीका इस्तेमाल किया गया है या नहीं, यहां दिया गया शेल कमांड चलाएं:

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 13 या इससे पहले के वर्शन वाले डिवाइसों पर, "एम्युलेटेड" डायरेक्ट बूट मोड काम करता है. यह मोड, एन्क्रिप्ट (सुरक्षित) की गई फ़ाइलों को लॉक और अनलॉक करने के असर को सिम्युलेट करने के लिए, फ़ाइल की अनुमतियों का इस्तेमाल करता है. एमुलेट किए गए मोड का इस्तेमाल सिर्फ़ डेवलपमेंट के दौरान करें. ऐसा करने से डेटा मिट सकता है. एम्युलेट किया गया डायरेक्ट बूट मोड चालू करने के लिए, डिवाइस पर लॉक पैटर्न सेट करें. लॉक पैटर्न सेट करते समय, सुरक्षित स्टार्ट-अप स्क्रीन का निर्देश मिलने पर "रहने दें" को चुनें. इसके बाद, यहां दिया गया शेल कमांड चलाएं:

    adb shell sm set-emulate-fbe true
    

    एम्युलेट किए गए डायरेक्ट बूट मोड को बंद करने के लिए, यह शेल कमांड चलाएं:

    adb shell sm set-emulate-fbe false
    

    इनमें से किसी भी निर्देश को चलाने पर, डिवाइस रीबूट हो जाता है.

डिवाइस से जुड़ी नीति को एन्क्रिप्ट (सुरक्षित) करने की स्थिति देखना

डिवाइस एडमिन ऐप्लिकेशन, डिवाइस के एन्क्रिप्शन (सुरक्षित) करने की मौजूदा स्थिति देखने के लिए, DevicePolicyManager.getStorageEncryptionStatus() का इस्तेमाल कर सकते हैं.

अगर आपका ऐप्लिकेशन Android 7.0 (एपीआई 24) से पहले के एपीआई लेवल को टारगेट करता है, तो डिवाइस पर फ़ुल-डिस्क एन्क्रिप्शन या Direct Boot के साथ फ़ाइल-आधारित एन्क्रिप्शन का इस्तेमाल होने पर, getStorageEncryptionStatus() ENCRYPTION_STATUS_ACTIVE दिखाता है. इन दोनों ही मामलों में, डेटा को हमेशा एन्क्रिप्ट (सुरक्षित) करके स्टोर किया जाता है.

अगर आपका ऐप्लिकेशन Android 7.0 (एपीआई 24) या उसके बाद के वर्शन को टारगेट करता है, तो डिवाइस पर फ़ुल-डिस्क एन्क्रिप्शन का इस्तेमाल होने पर, getStorageEncryptionStatus(), ENCRYPTION_STATUS_ACTIVE दिखाता है. अगर डिवाइस, डायरेक्ट बूट मोड के साथ फ़ाइल के आधार पर एन्क्रिप्ट (सुरक्षित) करने का तरीका इस्तेमाल कर रहा है, तो यह ENCRYPTION_STATUS_ACTIVE_PER_USER दिखाता है.

अगर आपने Android 7.0 के लिए डिवाइस मैनेजमेंट ऐप्लिकेशन बनाया है, तो डिवाइस एन्क्रिप्ट किया गया है या नहीं, यह पता करने के लिए ENCRYPTION_STATUS_ACTIVE और ENCRYPTION_STATUS_ACTIVE_PER_USER, दोनों की जांच करना न भूलें.

अतिरिक्त कोड सैंपल

DirectBoot सैंपल, इस पेज पर बताए गए एपीआई के इस्तेमाल के बारे में ज़्यादा जानकारी देता है.