पूरी डिस्क को सुरक्षित करना

पूरे डिस्क को एन्क्रिप्ट करने की प्रोसेस में, एन्क्रिप्ट की गई कुंजी का इस्तेमाल करके, Android डिवाइस पर उपयोगकर्ता का सारा डेटा कोड में बदल दिया जाता है. किसी डिवाइस को एन्क्रिप्ट करने के बाद, उपयोगकर्ता का बनाया गया सारा डेटा, डिस्क में सेव करने से पहले अपने-आप एन्क्रिप्ट हो जाता है. साथ ही, डेटा को कॉल करने वाली प्रोसेस में भेजने से पहले, उसे पढ़ने की सभी प्रोसेस अपने-आप डिक्रिप्ट हो जाती हैं.

Android 4.4 में, पूरी ड्राइव को सुरक्षित रखने की सुविधा को पेश किया गया था. हालांकि, Android 5.0 में ये नई सुविधाएं जोड़ी गईं:

  • डेटा को एन्क्रिप्ट करने का तेज़ तरीका इस्तेमाल किया गया. इसकी मदद से, सिर्फ़ डेटा पार्टिशन में इस्तेमाल किए गए ब्लॉक को एन्क्रिप्ट (सुरक्षित) किया जा सकता है ऐसा करना इसलिए ज़रूरी है, ताकि पहली बार बूट होने में ज़्यादा समय लगे. सिर्फ़ ext4 और f2fs फ़ाइल सिस्टम जो अभी तेज़ एन्क्रिप्शन का समर्थन करती है.
  • पहले बूट पर एन्क्रिप्ट करने के लिए, forceencrypt fstab फ़्लैग जोड़ा गया.
  • पासवर्ड के बिना पैटर्न और एन्क्रिप्शन (सुरक्षित करने का तरीका) की सुविधा जोड़ी गई.
  • एन्क्रिप्शन पासकोड को हार्डवेयर में सेव करने की सुविधा जोड़ी गई है. इसके लिए, ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) की साइनिंग सुविधा का इस्तेमाल किया जाता है. जैसे, TrustZone. ज़्यादा जानकारी के लिए, एन्क्रिप्ट की गई पासकोड को सेव करना देखें.

चेतावनी: Android 5.0 और इसके बाद के वर्शन वाले डिवाइसों पर अपग्रेड करें एन्क्रिप्ट (सुरक्षित) की गई फ़ाइलों को फ़ैक्ट्री डेटा रीसेट करके, फिर से एन्क्रिप्ट नहीं किया जा सकता है. नया Android 5.0 पहली बार बूट किए गए डिवाइस को एन्क्रिप्ट नहीं की गई स्थिति में वापस नहीं किया जा सकता.

Android की पूरी ड्राइव को सुरक्षित रखने की सुविधा कैसे काम करती है

Android की पूरी डिस्क को एन्क्रिप्ट (सुरक्षित) करने की सुविधा, dm-crypt पर आधारित है, जो एक कर्नेल है 'डिवाइस ब्लॉक करें लेयर' पर काम करने वाली सुविधा है. इस वजह से, एन्क्रिप्शन की सुविधा, एम्बेडेड मल्टीमीडिया कार्ड (eMMC) और उन मिलते-जुलते फ़्लैश डिवाइसों के साथ काम करती है जो खुद को कर्नेल के लिए ब्लॉक डिवाइसों के तौर पर दिखाते हैं. YAFFS की मदद से, डेटा को एन्क्रिप्ट (सुरक्षित) नहीं किया जा सकता. यह सीधे रॉ एनएंड फ़्लैश चिप से जुड़ा होता है.

एन्क्रिप्शन एल्गोरिदम, 128 ऐडवांस एन्क्रिप्शन स्टैंडर्ड (एईएस) है. इसमें, साइफ़र-ब्लॉक चेनिंग (सीबीसी) और ESSIV:SHA256 का इस्तेमाल किया जाता है. OpenSSL लाइब्रेरी को कॉल करके, मास्टर पासकोड को 128-बिट एईएस एल्गोरिदम से एन्क्रिप्ट किया जाता है. आपको पासकोड के लिए 128 बिट या इससे ज़्यादा का इस्तेमाल करना होगा. हालांकि, 256 बिट का इस्तेमाल करना ज़रूरी नहीं है.

ध्यान दें: मास्टर कुंजी को एन्क्रिप्ट करने के लिए, OEM 128-बिट या उसके बाद के वर्शन का इस्तेमाल कर सकते हैं.

Android 5.0 रिलीज़ में, चार प्रकार की एन्क्रिप्शन स्थितियां होती हैं:

  • डिफ़ॉल्ट
  • पिन
  • पासवर्ड
  • पैटर्न

पहली बार बूट करने पर, डिवाइस बिना किसी क्रम के जनरेट की गई 128-बिट वाली मास्टर कुंजी बनाता है और फिर उसे एक डिफ़ॉल्ट पासवर्ड और स्टोर किए गए सॉल्ट के साथ हैश किया जाता है. इसका डिफ़ॉल्ट पासवर्ड यह है: "default_password" हालांकि, इसके बाद मिले हैश को TEE (जैसे कि TrustZone) की मदद से भी साइन किया जाता है. जो मास्टर कुंजी को एन्क्रिप्ट करने के लिए हस्ताक्षर के हैश का उपयोग करता है.

Android Open Source Project की cryptfs.cpp फ़ाइल में, डिफ़ॉल्ट पासवर्ड देखा जा सकता है.

जब उपयोगकर्ता डिवाइस पर पिन/पास या पासवर्ड सेट करता है, तो सिर्फ़ 128-बिट कुंजी को फिर से एन्क्रिप्ट (सुरक्षित) किया जाता है और सेव किया जाता है. (उदाहरण के लिए, उपयोगकर्ता के पिन/पासवर्ड/पैटर्न में बदलाव करने पर, उपयोगकर्ता डेटा को फिर से एन्क्रिप्ट (सुरक्षित) नहीं किया जाता.) ध्यान दें कि मैनेज किया जा रहा डिवाइस पिन, पैटर्न या पासवर्ड से जुड़ी पाबंदियों के दायरे में आ सकते हैं.

एन्क्रिप्शन को init और vold मैनेज करते हैं. init, vold को कॉल करता है और vold, ट्रिगर करने के लिए प्रॉपर्टी सेट करता है init. सिस्टम के अन्य हिस्से भी प्रॉपर्टी देखते हैं, ताकि वे कुछ काम कर सकें. जैसे, स्टेटस की शिकायत करना, पासवर्ड मांगना या किसी गंभीर गड़बड़ी के मामले में फ़ैक्ट्री रीसेट करने का अनुरोध करना. vold में एन्क्रिप्शन की सुविधाएं चालू करने के लिए, सिस्टम कमांड-लाइन टूल vdc के cryptfs निर्देशों का इस्तेमाल करता है: checkpw, restart, enablecrypto, changepw, cryptocomplete, verifypw, setfield, getfield, mountdefaultencrypted, getpwtype, getpw, और clearpw.

/data, /data को एन्क्रिप्ट, डिक्रिप्ट या वाइप करने के लिए माउंट नहीं किया जाना चाहिए. हालांकि, कोई भी यूज़र इंटरफ़ेस (यूआई) दिखाने के लिए, फ़्रेमवर्क को शुरू करना ज़रूरी है. साथ ही, फ़्रेमवर्क को /data चलाने की ज़रूरत होती है. इस समस्या को हल करने के लिए, /data पर एक अस्थायी फ़ाइल सिस्टम माउंट किया जाता है. इससे Android, पासवर्ड का प्रॉम्प्ट दे सकता है, प्रोग्रेस दिखा सकता है या डेटा का सुझाव दे सकता है वाइप करें. हालांकि, इसकी एक सीमा है. टाम्पररी फ़ाइल सिस्टम से /data फ़ाइल सिस्टम पर स्विच करने के लिए, सिस्टम को टाम्पररी फ़ाइल सिस्टम पर खुली फ़ाइलों वाली हर प्रोसेस को रोकना होगा और उन प्रोसेस को /data फ़ाइल सिस्टम पर फिर से शुरू करना होगा. ऐसा करने के लिए, सभी सेवाएं तीन ग्रुप में से किसी एक में होना चाहिए: core, main, और late_start.

  • core: शुरू होने के बाद कभी शट डाउन न करें.
  • main: शट डाउन करें और डिस्क का पासवर्ड डालने के बाद रीस्टार्ट करें.
  • late_start: शुरू तब तक नहीं होगा, जब तक /data को डिक्रिप्ट और माउंट नहीं किया जाता.

इन कार्रवाइयों को ट्रिगर करने के लिए, vold.decrypt प्रॉपर्टी को अलग-अलग स्ट्रिंग पर सेट किया गया है. सेवाओं को बंद करने और फिर से चालू करने के लिए, init निर्देश ये हैं:

  • class_reset: किसी सेवा को बंद कर देता है, लेकिन class_start की मदद से उसे फिर से शुरू किया जा सकता है.
  • class_start: किसी सेवा को रीस्टार्ट करता है.
  • class_stop: किसी सेवा को बंद करता है और SVC_DISABLED फ़्लैग जोड़ता है. बंद की गई सेवाएं, class_start के अनुरोध का जवाब नहीं देती हैं.

फ़्लो

एन्क्रिप्ट किए गए डिवाइस के लिए चार फ़्लो होते हैं. डिवाइस को सिर्फ़ एक बार एन्क्रिप्ट (सुरक्षित) किया गया है और फिर सामान्य तरीके से बूट होता है.

  • पहले एन्क्रिप्ट (सुरक्षित) नहीं किए गए डिवाइस को एन्क्रिप्ट (सुरक्षित) करना:
    • forceencrypt की मदद से नए डिवाइस को एन्क्रिप्ट करना: डिवाइस को पहली बार चालू करने पर, एन्क्रिप्शन करना ज़रूरी है (Android L से शुरू).
    • मौजूदा डिवाइस को एन्क्रिप्ट करें: उपयोगकर्ता की ओर से शुरू किया गया एन्क्रिप्शन (Android K और उससे पहले के वर्शन).
  • एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को चालू करें:
    • बिना पासवर्ड वाले एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को चालू करना: एन्क्रिप्ट (सुरक्षित) किए गए ऐसे डिवाइस को बूट करना जिसके लिए कोई पासवर्ड सेट नहीं किया गया है. यह सुविधा, Android 5.0 और उसके बाद के वर्शन पर काम करने वाले डिवाइसों के लिए है.
    • एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को पासवर्ड से चालू करना: एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को चालू करना का पासवर्ड सेट है.

इन फ़्लो के अलावा, डिवाइस /data को एन्क्रिप्ट नहीं कर सकता. हर फ़्लो के बारे में यहां पूरी जानकारी दी गई है.

Salesforce की मदद से नए डिवाइस को एन्क्रिप्ट (सुरक्षित) करें

Android 5.0 डिवाइस के लिए, पहली बार बूट होने की यह सामान्य प्रक्रिया है.

  1. forceencrypt फ़्लैग की मदद से, एन्क्रिप्ट (सुरक्षित) नहीं किए गए फ़ाइल सिस्टम का पता लगाएं

    /data को एन्क्रिप्ट (सुरक्षित) नहीं किया गया है, क्योंकि forceencrypt के लिए यह ज़रूरी है. /data को अनमाउंट करें.

  2. /data को एन्क्रिप्ट करना शुरू करना

    vold.decrypt = "trigger_encryption", init.rc को ट्रिगर करता है, इसकी वजह से vold, /data को बिना पासवर्ड के एन्क्रिप्ट करता है. (कोई सेट नहीं है, क्योंकि यह नया डिवाइस होना चाहिए.)

  3. tmpfs को माउंट करना

    vold, tmpfs /data को माउंट करता है (इसके लिए tmpfs विकल्पों का इस्तेमाल करता है ro.crypto.tmpfs_options) प्रॉपर्टी को vold.encrypt_progress प्रॉपर्टी के तौर पर 0 पर सेट किया जाता है. vold, एन्क्रिप्ट (सुरक्षित) किए गए सिस्टम को चालू करने के लिए, tmpfs /data को तैयार करता है और प्रॉपर्टी vold.decrypt इससे: trigger_restart_min_framework

  4. प्रोग्रेस दिखाने के लिए फ़्रेमवर्क तैयार करना

    डिवाइस में एन्क्रिप्ट (सुरक्षित) करने के लिए कोई डेटा मौजूद नहीं है. इसलिए, प्रोग्रेस बार वे अक्सर इसलिए दिखते हैं, क्योंकि एन्क्रिप्ट (सुरक्षित) करने में बहुत ज़्यादा समय लगता है. यहां जाएं: ज़्यादा जानकारी के लिए, मौजूदा डिवाइस को एन्क्रिप्ट (सुरक्षित) करें प्रोग्रेस यूज़र इंटरफ़ेस (यूआई) की जानकारी.

  5. /data के एन्क्रिप्ट (सुरक्षित) होने पर, फ़्रेमवर्क को हटा दें

    vold, vold.decrypt को इस पर सेट करता है trigger_default_encryption जो defaultcrypto सेवा. (यह एन्क्रिप्ट (सुरक्षित) किए गए डिफ़ॉल्ट उपयोगकर्ता डेटा को माउंट करने के लिए, नीचे दिया गया फ़्लो शुरू करता है.) trigger_default_encryption एन्क्रिप्ट (सुरक्षित) करने का तरीका, ताकि यह देखा जा सके कि /data को पासवर्ड डालें. Android 5.0 डिवाइस को पहली बार बूट करने पर एन्क्रिप्ट (सुरक्षित) किया जाता है, इसलिए ऐसा होना चाहिए पासवर्ड सेट न हो; इसलिए, हम /data को डिक्रिप्ट और डिक्रिप्ट करते हैं.

  6. माउंट करें /data

    इसके बाद, init इसका इस्तेमाल करके /data को tmpfs रैम डिस्क पर माउंट करता है पैरामीटर, जिसे यह ro.crypto.tmpfs_options से चुनता है, जो कि एक बार सेट है init.rc में.

  7. Start फ़्रेमवर्क

    vold, vold.decrypt को trigger_restart_framework पर सेट करता है, जिससे सामान्य बूट प्रोसेस जारी रहती है.

मौजूदा डिवाइस एन्क्रिप्ट (सुरक्षित) करें

ऐसा तब होता है, जब एन्क्रिप्ट (सुरक्षित) नहीं किए गए Android K या इससे पहले के वर्शन को एन्क्रिप्ट (सुरक्षित) किया जाता है L पर माइग्रेट किया गया डिवाइस.

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

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

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

डिवाइस की स्थिति: ro.crypto.state = "unencrypted" सेट करें और चालू करने के लिए on nonencrypted init ट्रिगर को एक्ज़ीक्यूट करें.

  1. पासवर्ड की जांच करना

    यूज़र इंटरफ़ेस (यूआई), cryptfs enablecrypto inplace कमांड के साथ vold को कॉल करता है जहां passwd, उपयोगकर्ता की लॉक स्क्रीन का पासवर्ड है.

  2. फ़्रेमवर्क को हटाना

    vold, गड़बड़ियों का पता लगाता है और एन्क्रिप्ट (सुरक्षित) नहीं कर पाने पर, -1 दिखाता है. लॉग में किसी कारण को प्रिंट करता है. अगर एन्क्रिप्ट किया जा सकता है, तो यह प्रॉपर्टी vold.decrypt को trigger_shutdown_framework पर सेट करता है. इसकी वजह से init.rc late_start और main क्लास में सेवाओं को रोक देती है.

  3. क्रिप्टो फ़ुटर बनाना
  4. ब्रेडक्रंब फ़ाइल बनाना
  5. रीबूट करें
  6. ब्रेडक्रंब फ़ाइल का पता लगाना
  7. /data को एन्क्रिप्ट (सुरक्षित) करना शुरू करें

    vold इसके बाद, क्रिप्टो मैपिंग सेट अप करता है. इससे एक वर्चुअल क्रिप्टो ब्लॉक डिवाइस बनता है, जो असली ब्लॉक डिवाइस पर मैप होता है. हालांकि, इसमें हर सेक्टर को लिखते समय एन्क्रिप्ट किया जाता है और पढ़ते समय डिक्रिप्ट किया जाता है. इसके बाद, vold क्रिप्टो मेटाडेटा बनाता है और उसे लिखता है.

  8. एन्क्रिप्ट करने के दौरान, tmpfs को माउंट करना

    vold, tmpfs के विकल्पों का इस्तेमाल करके /data को माउंट करता है ro.crypto.tmpfs_options से) और प्रॉपर्टी सेट करता है vold.encrypt_progress से 0 तक. vold tmpf तैयार करता है एन्क्रिप्ट किए गए सिस्टम को चालू करने और प्रॉपर्टी को सेट करने के लिए /data vold.decrypt से: trigger_restart_min_framework

  9. प्रोग्रेस दिखाने के लिए फ़्रेमवर्क तैयार करना

    trigger_restart_min_framework के कारण init.rc की वजह से main सेवाओं की श्रेणी शुरू करें. जब फ़्रेमवर्क देखता है कि vold.encrypt_progress को 0 पर सेट किया गया है. इससे प्रोग्रेस बार दिखेगा यूज़र इंटरफ़ेस (यूआई), जो हर पांच सेकंड में उस प्रॉपर्टी के लिए क्वेरी करता है और एक प्रोग्रेस बार को अपडेट करता है. एन्क्रिप्शन लूप, हर बार partition का एक और प्रतिशत एन्क्रिप्ट करने पर vold.encrypt_progress को अपडेट करता है.

  10. /data को एन्क्रिप्ट (सुरक्षित) करने के बाद, क्रिप्टो फ़ुटर अपडेट करें

    /data को एन्क्रिप्ट करने के बाद, vold मेटाडेटा में मौजूद फ़्लैग ENCRYPTION_IN_PROGRESS को हटा देता है.

    डिवाइस के अनलॉक होने पर, पासवर्ड का इस्तेमाल इन कामों के लिए किया जाता है मास्टर कुंजी को एन्क्रिप्ट करें और क्रिप्टो फ़ुटर अपडेट हो जाता है.

    अगर किसी वजह से डिवाइस फिर से चालू नहीं हो पाता है, तो vold प्रॉपर्टी को सेट करता है vold.encrypt_progress से error_reboot_failed और यूज़र इंटरफ़ेस (यूआई) में एक मैसेज दिखना चाहिए. इस मैसेज में, उपयोगकर्ता से डिवाइस को फिर से चालू करें. ऐसा कभी होने की उम्मीद नहीं है.

एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को डिफ़ॉल्ट एन्क्रिप्शन के साथ चालू करना

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

  1. बिना पासवर्ड के एन्क्रिप्ट (सुरक्षित) किए गए /data का पता लगाएं

    पता करें कि Android डिवाइस को एन्क्रिप्ट (सुरक्षित) किया गया है, क्योंकि /data किसी एक फ़्लैग को माउंट नहीं किया जा सकताencryptable या forceencrypt सेट है.

    vold, vold.decrypt को trigger_default_encryption पर सेट करता है, जिससे defaultcrypto सेवा शुरू हो जाती है. trigger_default_encryption अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है एन्क्रिप्शन के टाइप की जांच करके पता लगाता है कि /data को बिना पासवर्ड के साइन इन करें.

  2. /data को डिक्रिप्ट करना

    ब्लॉक किए गए डिवाइस पर dm-crypt डिवाइस बनाता है, ताकि डिवाइस इस्तेमाल के लिए तैयार हो जाए.

  3. /data को माउंट करना

    इसके बाद, vold, डिक्रिप्ट किए गए असली /data पार्टीशन को माउंट करेगा और फिर नया सेगमेंट तैयार करता है. यह प्रॉपर्टी को सेट करता है vold.post_fs_data_done को 0 पर सेट करने के बाद, vold.decrypt को सेट किया जाता है trigger_post_fs_data के लिए. इससे init.rc चलता है इसके post-fs-data निर्देश. वे सभी ज़रूरी डायरेक्ट्री बनाते हैं या लिंक जोड़ें और फिर vold.post_fs_data_done को 1 पर सेट करें.

    जब vold को उस प्रॉपर्टी में 1 दिखेगा, तब प्रॉपर्टी सेट हो जाएगी vold.decrypt इससे: trigger_restart_framework. इस init.rc के कारण main क्लास में सेवाएं शुरू हो रही हैं साथ ही, क्लास late_start में अपनी सेवाएं फिर से शुरू करें बूट के बाद से समय.

  4. Start फ़्रेमवर्क

    अब फ़्रेमवर्क, डिक्रिप्ट किए गए /data का इस्तेमाल करके अपनी सभी सेवाओं को बूट करता है और सिस्टम इस्तेमाल के लिए तैयार हो जाता है.

एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को डिफ़ॉल्ट एन्क्रिप्शन के बिना चालू करना

ऐसा तब होता है, जब आप ऐसे एन्क्रिप्ट किए गए डिवाइस को चालू करते हैं जिसमें पासवर्ड डालें. डिवाइस का पासवर्ड, पिन, पैटर्न या पासवर्ड हो सकता है.

  1. पासवर्ड से एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस का पता लगाना

    पता लगाएं कि Android डिवाइस को एनक्रिप्ट (सुरक्षित) किया गया है, क्योंकि ro.crypto.state = "encrypted" अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है

    vold, vold.decrypt को trigger_restart_min_framework पर सेट करता है, क्योंकि /data को पासवर्ड से एन्क्रिप्ट (सुरक्षित) किया गया है.

  2. माउंट टीएमपीएफ़एस

    init, माउंट करने के शुरुआती विकल्पों को सेव करने के लिए, पांच प्रॉपर्टी सेट करता है init.rc से पास किए गए पैरामीटर के साथ /data के लिए दिया गया. vold क्रिप्टो मैपिंग सेट अप करने के लिए इन प्रॉपर्टी का इस्तेमाल करता है:

    1. ro.crypto.fs_type
    2. ro.crypto.fs_real_blkdev
    3. ro.crypto.fs_mnt_point
    4. ro.crypto.fs_options
    5. ro.crypto.fs_flags (ASCII में 0x से पहले आठ अंकों वाला हेक्स नंबर)
  3. पासवर्ड के प्रॉम्प्ट के लिए फ़्रेमवर्क शुरू करें

    फ़्रेमवर्क शुरू होता है और पता चलता है कि vold.decrypt इस पर सेट है trigger_restart_min_framework. इससे फ़्रेमवर्क को पता चलता है कि वह /data डिस्क पर बूट हो रहा है और उसे उपयोगकर्ता का पासवर्ड चाहिए.

    हालांकि, सबसे पहले यह पक्का करना होगा कि डिस्क को सही तरीके से एन्क्रिप्ट (सुरक्षित) किया गया हो. यह vold को cryptfs cryptocomplete निर्देश भेजता है. अगर एन्क्रिप्ट (सुरक्षित) करने की प्रोसेस पूरी हो गई है, तो vold 0 दिखाता है, अंदरूनी गड़बड़ी पर -1 दिखाता है या -2 अगर एन्क्रिप्ट (सुरक्षित) नहीं किया गया. vold, CRYPTO_ENCRYPTION_IN_PROGRESS फ़्लैग के क्रिप्टो मेटाडेटा को देखकर यह तय करता है. अगर यह सेट है, तो एन्क्रिप्ट (सुरक्षित) करने की प्रोसेस में रुकावट आई थी और को डिवाइस में इस्तेमाल किया जा सकता है. अगर vold गड़बड़ी का मैसेज दिखाता है, तो यूज़र इंटरफ़ेस (यूआई) को उपयोगकर्ता को डिवाइस को रीबूट करने और फ़ैक्ट्री रीसेट करने का मैसेज दिखाना चाहिए. साथ ही, उपयोगकर्ता को ऐसा करने के लिए एक बटन देना चाहिए.

  4. पासवर्ड का इस्तेमाल करके डेटा डिक्रिप्ट करना

    cryptfs cryptocomplete पूरा होने के बाद, फ़्रेमवर्क एक यूज़र इंटरफ़ेस (यूआई) दिखाता है, जिसमें डिस्क का पासवर्ड मांगा जाता है. यूज़र इंटरफ़ेस (यूआई) इसके हिसाब से पासवर्ड की जांच करता है vold को cryptfs checkpw निर्देश भेज रही हूँ. अगर पासवर्ड सही है (जिसका पता लगाने के लिए /data को किसी अस्थायी जगह पर डिक्रिप्ट किया गया, फिर अलग किया गया), vold, प्रॉपर्टी में डिक्रिप्ट किए गए ब्लॉक डिवाइस का नाम सेव करता है ro.crypto.fs_crypto_blkdev और यूज़र इंटरफ़ेस (यूआई) पर स्थिति 0 दिखाता है. अगर पासवर्ड गलत है, तो यह यूज़र इंटरफ़ेस (यूआई) में -1 दिखाता है.

  5. फ़्रेमवर्क बंद करना

    यूज़र इंटरफ़ेस (यूआई), क्रिप्टो बूट ग्राफ़िक दिखाता है. इसके बाद, cryptfs restart कमांड के साथ vold को कॉल करता है. vold, प्रॉपर्टी को vold.decrypt से trigger_reset_main पर सेट करता है. इससे, init.rc class_reset main करता है. इससे मुख्य क्लास में मौजूद सभी सेवाएं बंद हो जाती हैं. इससे tmpfs /data को अनमाउंट किया जा सकता है.

  6. माउंट /data

    इसके बाद, vold, डिक्रिप्ट किए गए असली /data पार्टीशन को माउंट करेगा और नया विभाजन तैयार करता है (जो शायद कभी तैयार नहीं हुआ इसे वाइप करने के विकल्प की मदद से एन्क्रिप्ट (सुरक्षित) किया गया था. यह पहले काम नहीं करता रिलीज़ करें). यह प्रॉपर्टी vold.post_fs_data_done को 0 पर सेट करता है और फिर vold.decrypt को trigger_post_fs_data पर सेट करता है. इससे init.rc, अपने post-fs-data कमांड चलाता है. वे ज़रूरी डायरेक्ट्री या लिंक बनाते हैं और फिर vold.post_fs_data_done को 1 पर सेट करते हैं. जब vold को उस प्रॉपर्टी में 1 दिखता है, तो वह प्रॉपर्टी vold.decrypt को trigger_restart_framework पर सेट कर देता है. इससे init.rc शुरू होता है main कैटगरी में फिर से अपनी सेवाएं पाएं. साथ ही, क्लास में अपनी सेवाएं शुरू करें बूट होने के बाद पहली बार late_start.

  7. पूरा फ़्रेमवर्क शुरू करना

    अब फ़्रेमवर्क, डिक्रिप्ट किए गए /data का इस्तेमाल करके अपनी सभी सेवाओं को चालू करता है फ़ाइल सिस्टम में सेव किया जाता है और सिस्टम इस्तेमाल के लिए तैयार है.

कार्रवाई सफल नहीं हुई

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

  1. एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को पासवर्ड की मदद से पहचानें
  2. माउंट tmpfs
  3. पासवर्ड के प्रॉम्प्ट के लिए फ़्रेमवर्क शुरू करें

हालांकि, फ़्रेमवर्क खुलने के बाद डिवाइस में कुछ गड़बड़ियां हो सकती हैं:

  • पासवर्ड मैच होता है, लेकिन डेटा को डिक्रिप्ट नहीं किया जा सकता
  • उपयोगकर्ता 30 बार गलत पासवर्ड डालता है

अगर ये गड़बड़ियां ठीक नहीं होती हैं, तो उपयोगकर्ता को फ़ैक्ट्री रीसेट करने के लिए कहें:

अगर एन्क्रिप्ट (सुरक्षित) करने की प्रोसेस के दौरान vold को कोई गड़बड़ी का पता चलता है और अब तक कोई डेटा मिटाया नहीं गया है और फ़्रेमवर्क चालू है, तो vold, प्रॉपर्टी vold.encrypt_progress को error_not_encrypted पर सेट करता है. यूज़र इंटरफ़ेस (यूआई) की इमेज, जिसमें उपयोगकर्ता को फिर से चालू करने का निर्देश दिया गया है. साथ ही, उन्हें एन्क्रिप्ट (सुरक्षित) करने के तरीके के बारे में सूचना दी गई है शुरू नहीं किया. अगर फ़्रेमवर्क टूट जाने के बाद गड़बड़ी होती है, लेकिन प्रोग्रेस बार यूज़र इंटरफ़ेस (यूआई) चालू होने से पहले, vold सिस्टम को फिर से चालू कर देता है. अगर आपने फिर से चालू नहीं हो पाता है, तो यह vold.encrypt_progress को error_shutting_down और रिटर्न -1; लेकिन आपको कुछ भी नहीं ताकि गड़बड़ी को ठीक किया जा सके. ऐसा नहीं होना चाहिए.

अगर एन्क्रिप्ट (सुरक्षित) करने की प्रोसेस के दौरान vold को किसी गड़बड़ी का पता चलता है, तो यह vold.encrypt_progress से error_partially_encrypted तक और -1 दिखाता है. इसके बाद, यूज़र इंटरफ़ेस (यूआई) पर एक मैसेज दिखेगा, जिसमें बताया जाएगा कि एन्क्रिप्शन की प्रोसेस पूरी नहीं हो सकी. साथ ही, उपयोगकर्ता को डिवाइस को फ़ैक्ट्री रीसेट करने के लिए एक बटन भी दिखेगा.

एन्क्रिप्ट (सुरक्षित) की गई कुंजी को सेव करना

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

  1. 16-बाइट की रैंडम डिस्क एन्क्रिप्शन पासकोड (डीईके) और 16-बाइट का नमक जनरेट करें.
  2. उपयोगकर्ता के पासवर्ड और नमक पर स्क्रिप्ट लागू करें, ताकि 32-बाइट इंटरमीडिएट की 1 (IK1) बनाई जा सके.
  3. IK1 को शून्य बाइट के साथ, हार्डवेयर से जुड़ी निजी कुंजी (HBK) के साइज़ तक पैड करें. खास तौर पर, हम इस तरह पैड करते हैं: 00 || IK1 || 00..00; एक शून्य बाइट, 32 IK1 बाइट, 223 शून्य बाइट.
  4. 256-बाइट का IK2 बनाने के लिए, पैड किए गए IK1 को HBK के साथ साइन करें.
  5. 32-बाइट का IK3 बनाने के लिए, IK2 और नमक (दूसरे चरण में इस्तेमाल किए गए नमक के जैसे) पर स्क्रिप्ट लागू करें.
  6. IK3 की शुरुआती 16 बाइट का इस्तेमाल KEK और आखिरी 16 बाइट को IV के तौर पर करें.
  7. AES_CBC की मदद से DEK को एन्क्रिप्ट (सुरक्षित) करने के लिए, KEK और इनिशलाइज़ेशन वेक्टर IV का इस्तेमाल करें.

पासवर्ड बदलें

जब कोई उपयोगकर्ता सेटिंग में जाकर अपना पासवर्ड बदलने या हटाने का विकल्प चुनता है, तो यूज़र इंटरफ़ेस (यूआई) cryptfs changepw को vold निर्देश भेजता है. इसके बाद, vold डिस्क की मुख्य कुंजी को नए पासवर्ड से फिर से एन्क्रिप्ट (सुरक्षित) करता है.

एन्क्रिप्शन प्रॉपर्टी

vold और init एक-दूसरे से इसके ज़रिए बातचीत करते हैं सेटिंग प्रॉपर्टी. यहां एन्क्रिप्ट (सुरक्षित) करने के लिए उपलब्ध प्रॉपर्टी की सूची दी गई है.

Vold प्रॉपर्टी

प्रॉपर्टी ब्यौरा
vold.decrypt trigger_encryption ड्राइव को बिना पासवर्ड के एन्क्रिप्ट करें.
vold.decrypt trigger_default_encryption यह देखने के लिए डिस्क की जांच करें कि उसे बिना पासवर्ड के एन्क्रिप्ट किया गया है या नहीं. अगर ऐसा है, तो उसे डिक्रिप्ट करके माउंट करें. अगर ऐसा नहीं है, तो vold.decrypt को trigger_restart_min_framework पर सेट करें.
vold.decrypt trigger_reset_main डिस्क का पासवर्ड मांगने वाला यूज़र इंटरफ़ेस (यूआई) बंद करने के लिए, वॉल्ड की मदद से सेट करें.
vold.decrypt trigger_post_fs_data /data को ज़रूरी डायरेक्ट्री के साथ तैयार करने के लिए वॉल्यूम के हिसाब से सेट करें.
vold.decrypt trigger_restart_framework असल फ़्रेमवर्क और सभी सेवाओं को चालू करने के लिए vold सेट करें.
vold.decrypt trigger_shutdown_framework डेटा को एन्क्रिप्ट (सुरक्षित) करने की प्रोसेस शुरू करने के लिए, इसे पूरा फ़्रेमवर्क बंद करने के लिए वॉल्ड पर सेट करें.
vold.decrypt trigger_restart_min_framework वॉल्यूम से सेट करें एन्क्रिप्शन के लिए प्रोग्रेस बार यूज़र इंटरफ़ेस (यूआई) या पासवर्ड के लिए संकेत, जो इस पर निर्भर करता है ro.crypto.state की वैल्यू.
vold.encrypt_progress फ़्रेमवर्क शुरू होने पर, अगर यह प्रॉपर्टी सेट है, तो प्रोग्रेस बार के यूज़र इंटरफ़ेस (यूआई) मोड में जाएं.
vold.encrypt_progress 0 to 100 प्रोग्रेस बार यूज़र इंटरफ़ेस (यूआई) को प्रतिशत वैल्यू के सेट को दिखाता है.
vold.encrypt_progress error_partially_encrypted प्रोग्रेस बार के यूज़र इंटरफ़ेस (यूआई) पर यह मैसेज दिखना चाहिए कि एन्क्रिप्ट (सुरक्षित) नहीं हो सका. उपयोगकर्ता को ये काम करने का विकल्प देना डिवाइस को फ़ैक्ट्री रीसेट कर दिया जाता है.
vold.encrypt_progress error_reboot_failed प्रोग्रेस बार के यूज़र इंटरफ़ेस (यूआई) पर यह मैसेज दिखना चाहिए: एन्क्रिप्शन पूरा हो जाए, और उपयोगकर्ता को डिवाइस फिर चालू करने का बटन दें. इस गड़बड़ी की उम्मीद नहीं है.
vold.encrypt_progress error_not_encrypted प्रोग्रेस बार यूज़र इंटरफ़ेस (यूआई) को गड़बड़ी वाला मैसेज दिखाओ नहीं हुए, तो कोई डेटा एन्क्रिप्ट (सुरक्षित) नहीं किया गया था या साथ ही, उपयोगकर्ता को सिस्टम फिर से चालू करने का बटन दें.
vold.encrypt_progress error_shutting_down प्रोग्रेस बार का यूज़र इंटरफ़ेस (यूआई) काम नहीं कर रहा है. इसलिए, जवाब देने वाले की जानकारी नहीं है इस गड़बड़ी को ठीक करना. ऐसा कभी नहीं होना चाहिए.
vold.post_fs_data_done 0 vold.decrypt को trigger_post_fs_data पर सेट करने से ठीक पहले, vold ने सेट किया.
vold.post_fs_data_done 1 इसे init.rc ने सेट किया हो या init.rc टास्क पूरा होने के बाद post-fs-data.

init प्रॉपर्टी

प्रॉपर्टी ब्यौरा
ro.crypto.fs_crypto_blkdev vold कमांड checkpw का इस्तेमाल करके सेट किया जाता है, ताकि बाद में vold कमांड restart का इस्तेमाल करके इसका इस्तेमाल किया जा सके.
ro.crypto.state unencrypted init के हिसाब से यह सिस्टम, एन्क्रिप्ट (सुरक्षित) नहीं किए गए मोड के साथ चल रहा है /data ro.crypto.state encrypted. init से सेट किया गया, ताकि यह पता चल सके कि यह सिस्टम एन्क्रिप्ट (सुरक्षित) किए गए /data के साथ चल रहा है.

ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags

ये पांच प्रॉपर्टी init से पास किए गए पैरामीटर के साथ, /data को माउंट करने की कोशिश करते समय init.rc. vold, क्रिप्टो मैपिंग को सेट अप करने के लिए इनका इस्तेमाल करता है.
ro.crypto.tmpfs_options init.rc से सेट किया गया, उन विकल्पों के साथ init को इस्तेमाल करना चाहिए जब tmpfs /data फ़ाइल सिस्टम को माउंट किया जा रहा हो.

init कार्रवाइयां

on post-fs-data
on nonencrypted
on property:vold.decrypt=trigger_reset_main
on property:vold.decrypt=trigger_post_fs_data
on property:vold.decrypt=trigger_restart_min_framework
on property:vold.decrypt=trigger_restart_framework
on property:vold.decrypt=trigger_shutdown_framework
on property:vold.decrypt=trigger_encryption
on property:vold.decrypt=trigger_default_encryption