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

पूरे डिस्क को एन्क्रिप्ट करने की प्रोसेस में, एन्क्रिप्ट की गई कुंजी का इस्तेमाल करके, 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" हालांकि, इस हैश को भी टीईई (जैसे, 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 को एन्क्रिप्ट नहीं कर सकता. हर फ़्लो के बारे में यहां पूरी जानकारी दी गई है.

forceencrypt की मदद से नए डिवाइस को एन्क्रिप्ट करना

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

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

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

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

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

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

    vold, ro.crypto.tmpfs_options में मौजूद tmpfs विकल्पों का इस्तेमाल करके, एक tmpfs /data माउंट करता है और प्रॉपर्टी 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 RAMDisk पर mount करता है. इसके लिए, वह ro.crypto.tmpfs_options से मिले पैरामीटर का इस्तेमाल करता है, जो init.rc में सेट होता है.

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

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

किसी मौजूदा डिवाइस को एन्क्रिप्ट करना

ऐसा तब होता है, जब Android K या उससे पहले के वर्शन वाले किसी ऐसे डिवाइस को एन्क्रिप्ट किया जाता है जिसे Android 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, ro.crypto.tmpfs_options से मिले tmpfs विकल्पों का इस्तेमाल करके, एक tmpfs /data माउंट करता है और प्रॉपर्टी vold.encrypt_progress को 0 पर सेट करता है. एन्क्रिप्ट किए गए सिस्टम को बूट करने के लिए, vold, टाम्प फ़ाइल सिस्टम (tmpfs)/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 को mount नहीं किया जा सकता और 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. tmpfs को माउंट करना

    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 डिस्क पर बूट हो रहा है और उसे उपयोगकर्ता का पासवर्ड चाहिए.

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

  4. पासवर्ड की मदद से डेटा को डिक्रिप्ट करना

    cryptfs cryptocomplete पूरा होने के बाद, फ़्रेमवर्क एक यूज़र इंटरफ़ेस (यूआई) दिखाता है, जिसमें डिस्क का पासवर्ड मांगा जाता है. यूज़र इंटरफ़ेस, cryptfs checkpw से vold को कमांड भेजकर पासवर्ड की जांच करता है. अगर पासवर्ड सही है (यह पता करने के लिए, डिक्रिप्ट किए गए /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 दिखाता है. इसके बाद, यूज़र इंटरफ़ेस (यूआई) पर एक मैसेज दिखेगा, जिसमें बताया जाएगा कि एन्क्रिप्शन की प्रोसेस पूरी नहीं हो सकी. साथ ही, उपयोगकर्ता को डिवाइस को फ़ैक्ट्री रीसेट करने के लिए एक बटन भी दिखेगा.

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

एन्क्रिप्ट की गई कुंजी, क्रिप्टो मेटाडेटा में सेव होती है. हार्डवेयर बैकअप की सुविधा, ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) की हस्ताक्षर करने की सुविधा का इस्तेमाल करके लागू की जाती है. पहले, हमने उपयोगकर्ता के पासवर्ड और सेव किए गए साल्ट पर स्क्रिप्ट का इस्तेमाल करके जनरेट की गई कुंजी से, मास्टर कुंजी को एन्क्रिप्ट किया था. इस कुंजी को ऑफ़-बॉक्स हमलों से सुरक्षित रखने के लिए, हम इस एल्गोरिदम को बेहतर बनाते हैं. इसके लिए, हम इस कुंजी को सेव की गई TEE कुंजी से साइन करते हैं. इसके बाद, 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. एईएस_सीबीसी, केईके कुंजी, और इनिशलाइज़ेशन वेक्टर 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 ने इसे सेट किया है.
vold.decrypt trigger_post_fs_data /data को ज़रूरी डायरेक्ट्री वगैरह के साथ तैयार करने के लिए, vold ने सेट किया है.
vold.decrypt trigger_restart_framework असल फ़्रेमवर्क और सभी सेवाओं को शुरू करने के लिए, vold से सेट किया गया.
vold.decrypt trigger_shutdown_framework एन्क्रिप्शन शुरू करने के लिए, पूरे फ़्रेमवर्क को बंद करने के लिए vold से सेट किया गया.
vold.decrypt trigger_restart_min_framework ro.crypto.state की वैल्यू के आधार पर, एन्क्रिप्शन के लिए प्रोग्रेस बार यूज़र इंटरफ़ेस (यूआई) शुरू करने या पासवर्ड डालने के लिए प्रॉम्प्ट करने के लिए, vold से सेट किया गया.
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 तक या post-fs-data टास्क पूरा करने के बाद, init.rc पर सेट करें.

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

init actions

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