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

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() पर कॉल करके यह पता लगाया जा सकता है.

मौजूदा डेटा को माइग्रेट करना

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