फ़ुल-डिस्क एन्क्रिप्शन, Android डिवाइस पर मौजूद उपयोगकर्ता के पूरे डेटा को एन्क्रिप्ट (सुरक्षित) की गई कुंजी का इस्तेमाल करके एन्कोड करने की प्रोसेस है. किसी डिवाइस को एन्क्रिप्ट (सुरक्षित) करने के बाद, उपयोगकर्ता का बनाया गया सारा डेटा अपने-आप एन्क्रिप्ट (सुरक्षित) हो जाता है. इसके बाद, इसे डिस्क में सेव किया जाता है. साथ ही, सभी रीड प्रोसेस, डेटा को अपने-आप डिक्रिप्ट (सुरक्षित किए गए डेटा को सामान्य डेटा में बदलना) करती हैं. इसके बाद, इसे कॉल करने वाली प्रोसेस को वापस भेजती हैं.
Android 4.4 में, पूरे डिस्क को एन्क्रिप्ट (सुरक्षित) करने की सुविधा पेश की गई थी. हालांकि, Android 5.0 में ये नई सुविधाएं पेश की गई थीं:
- तेज़ी से एन्क्रिप्ट (सुरक्षित) करने की सुविधा बनाई गई है. यह सुविधा, डेटा पार्टीशन पर इस्तेमाल किए गए ब्लॉक को ही एन्क्रिप्ट (सुरक्षित) करती है, ताकि पहली बार बूट होने में ज़्यादा समय न लगे. फ़िलहाल, सिर्फ़ ext4 और f2fs फ़ाइलसिस्टम में फ़ास्ट एन्क्रिप्शन की सुविधा काम करती है.
- पहले बूट पर एन्क्रिप्ट (सुरक्षित) करने के लिए,
forceencryptfstab फ़्लैग जोड़ा गया. - बिना पासवर्ड के पैटर्न और एन्क्रिप्शन की सुविधा जोड़ी गई है.
- ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) की साइनिंग सुविधा (जैसे कि TrustZone) का इस्तेमाल करके, एन्क्रिप्शन कुंजी के लिए हार्डवेयर की मदद से सुरक्षित किए गए स्टोरेज को जोड़ा गया. ज़्यादा जानकारी के लिए, एन्क्रिप्ट (सुरक्षित) की गई कुंजी को सेव करना लेख पढ़ें.
चेतावनी: Android 5.0 में अपग्रेड किए गए और फिर एन्क्रिप्ट (सुरक्षित) किए गए डिवाइसों को फ़ैक्ट्री डेटा रीसेट करके, एन्क्रिप्ट (सुरक्षित) न की गई स्थिति में वापस लाया जा सकता है. Android 5.0 वाले नए डिवाइसों को पहली बार बूट करने पर एन्क्रिप्ट (सुरक्षित) किया जाता है. इन्हें एन्क्रिप्ट (सुरक्षित) नहीं किया जा सकता.
Android में पूरी डिस्क को सुरक्षित रखने की सुविधा कैसे काम करती है
Android में पूरी डिस्क को सुरक्षित रखने की सुविधा, dm-crypt पर आधारित होती है. यह कर्नल की एक सुविधा है, जो ब्लॉक डिवाइस लेयर पर काम करती है. इस वजह से, एन्क्रिप्शन की सुविधा, एम्बेड किए गए मल्टीमीडिया कार्ड (eMMC) और इसी तरह के फ़्लैश डिवाइसों के साथ काम करती है. ये डिवाइस, कर्नल को ब्लॉक डिवाइस के तौर पर दिखाते हैं. YAFFS के साथ एन्क्रिप्शन की सुविधा काम नहीं करती है. यह सीधे तौर पर रॉ NAND फ़्लैश चिप से कम्यूनिकेट करता है.
एन्क्रिप्शन एल्गोरिदम, 128 ऐडवांस एन्क्रिप्शन स्टैंडर्ड (एईएस) है. इसमें साइफ़र-ब्लॉक चेनिंग (सीबीसी) और ESSIV:SHA256 का इस्तेमाल किया जाता है. मास्टर कुंजी को OpenSSL लाइब्रेरी को कॉल करके, 128-बिट एईएस की मदद से एन्क्रिप्ट (सुरक्षित) किया जाता है. आपको पासकोड के लिए 128 बिट या इससे ज़्यादा का इस्तेमाल करना होगा. हालांकि, 256 बिट का इस्तेमाल करना ज़रूरी नहीं है.
ध्यान दें: ओईएम, मास्टर की को एन्क्रिप्ट (सुरक्षित) करने के लिए 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के अनुरोधों का जवाब नहीं देती हैं.
Flows
एन्क्रिप्ट किए गए डिवाइस के लिए, चार फ़्लो होते हैं. किसी डिवाइस को सिर्फ़ एक बार एन्क्रिप्ट (सुरक्षित) किया जाता है. इसके बाद, वह सामान्य बूट फ़्लो का पालन करता है.
- पहले से एन्क्रिप्ट (सुरक्षित) न किए गए डिवाइस को एन्क्रिप्ट (सुरक्षित) करें:
forceencryptकी मदद से नए डिवाइस को एन्क्रिप्ट (सुरक्षित) करें: पहली बार बूट करने पर एन्क्रिप्शन (सुरक्षित) करना ज़रूरी है (Android L से शुरू).- मौजूदा डिवाइस को एन्क्रिप्ट करना: उपयोगकर्ता की ओर से शुरू किया गया एन्क्रिप्शन (Android K और इससे पहले के वर्शन).
- एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को बूट करना:
- पासवर्ड के बिना एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को चालू करना: एन्क्रिप्ट (सुरक्षित) किए गए ऐसे डिवाइस को बूट करना जिसमें कोई पासवर्ड सेट नहीं किया गया है. यह Android 5.0 और इसके बाद के वर्शन पर चलने वाले डिवाइसों के लिए ज़रूरी है.
- पासवर्ड की मदद से एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को शुरू करना: एन्क्रिप्ट (सुरक्षित) किए गए ऐसे डिवाइस को बूट करना जिस पर पासवर्ड सेट किया गया हो.
इन फ़्लो के अलावा, डिवाइस /data को एन्क्रिप्ट (सुरक्षित) करने में भी फ़ेल हो सकता है.
यहां दिए गए सेक्शन में, हर फ़्लो के बारे में ज़्यादा जानकारी दी गई है.
forceencrypt का इस्तेमाल करके, नए डिवाइस को एन्क्रिप्ट (सुरक्षित) करना
Android 5.0 डिवाइस के लिए, यह सामान्य फ़र्स्ट बूट है.
forceencryptफ़्लैग की मदद से, बिना एन्क्रिप्ट किए गए फ़ाइल सिस्टम का पता लगाना/dataको एन्क्रिप्ट (सुरक्षित) नहीं किया गया है. हालांकि,forceencryptके लिए ऐसा करना ज़रूरी है./dataको अनमाउंट करें.- डेटा को एन्क्रिप्ट (सुरक्षित) करना शुरू करें
/datavold.decrypt = "trigger_encryption"ट्रिगर करता हैinit.rc, जिससेvold,/dataको बिना पासवर्ड के एन्क्रिप्ट (सुरक्षित) करता है. (कोई भी डिवाइस सेट नहीं है, क्योंकि यह नया डिवाइस होना चाहिए.) - tmpfs को माउंट करना
vold, tmpfs/dataको माउंट करता है (ro.crypto.tmpfs_optionsसे tmpfs विकल्पों का इस्तेमाल करके) औरvold.encrypt_progressप्रॉपर्टी को 0 पर सेट करता है.vold, एन्क्रिप्ट किए गए सिस्टम को बूट करने के लिए tmpfs/dataतैयार करता है. साथ ही,vold.decryptप्रॉपर्टी कोtrigger_restart_min_frameworkपर सेट करता है - प्रोग्रेस दिखाने के लिए फ़्रेमवर्क को ऊपर लाना
डिवाइस में एन्क्रिप्ट (सुरक्षित) करने के लिए कोई डेटा नहीं है. इसलिए, प्रोग्रेस बार अक्सर नहीं दिखेगा, क्योंकि एन्क्रिप्शन की प्रोसेस बहुत तेज़ी से होती है. प्रोग्रेस यूज़र इंटरफ़ेस (यूआई) के बारे में ज़्यादा जानकारी के लिए, मौजूदा डिवाइस को एन्क्रिप्ट (सुरक्षित) करना लेख पढ़ें.
/dataके एन्क्रिप्ट (सुरक्षित) होने पर, फ़्रेमवर्क को हटा देंvoldvold.decryptकोtrigger_default_encryptionपर सेट करता है. इससेdefaultcryptoसेवा शुरू हो जाती है. (इससे, सुरक्षित किए गए डिफ़ॉल्ट userdata को माउंट करने के लिए नीचे दिया गया फ़्लो शुरू हो जाता है.)trigger_default_encryption, एन्क्रिप्शन (सुरक्षित) करने के तरीके की जांच करता है. इससे यह पता चलता है कि/dataको पासवर्ड के साथ या उसके बिना एन्क्रिप्ट (सुरक्षित) किया गया है. Android 5.0 वाले डिवाइसों को पहली बार बूट करने पर एन्क्रिप्ट किया जाता है. इसलिए, कोई पासवर्ड सेट नहीं होना चाहिए. इसलिए, हम/dataको डिक्रिप्ट और माउंट करते हैं.- माउंट
/dataइसके बाद,
init,/dataको tmpfs RAMDisk पर माउंट करता है. इसके लिए, वहro.crypto.tmpfs_optionsसे पैरामीटर लेता है.ro.crypto.tmpfs_optionsकोinit.rcमें सेट किया जाता है. - फ़्रेमवर्क शुरू करें
vold,vold.decryptकोtrigger_restart_frameworkपर सेट करता है. इससे बूट करने की सामान्य प्रोसेस जारी रहती है.
किसी मौजूदा डिवाइस को एन्क्रिप्ट (सुरक्षित) करना
जब Android K या इससे पहले के वर्शन वाले किसी ऐसे डिवाइस को एन्क्रिप्ट (सुरक्षित) किया जाता है जिसे L पर माइग्रेट किया गया हो, तो ऐसा होता है.
यह प्रोसेस उपयोगकर्ता शुरू करता है. कोड में इसे “इनप्लेस एन्क्रिप्शन” कहा जाता है. जब कोई उपयोगकर्ता किसी डिवाइस को एन्क्रिप्ट (सुरक्षित) करने का विकल्प चुनता है, तो यूज़र इंटरफ़ेस (यूआई) यह पक्का करता है कि बैटरी पूरी तरह चार्ज हो और एसी अडैप्टर प्लग इन हो, ताकि एन्क्रिप्शन की प्रोसेस पूरी करने के लिए डिवाइस में ज़रूरी पावर हो.
चेतावनी: अगर डिवाइस की बैटरी खत्म हो जाती है और एन्क्रिप्ट (सुरक्षित) करने की प्रोसेस पूरी होने से पहले ही वह बंद हो जाता है, तो फ़ाइल का डेटा आंशिक रूप से एन्क्रिप्ट (सुरक्षित) हो जाता है. डिवाइस को फ़ैक्ट्री रीसेट करना होगा. इससे सारा डेटा मिट जाएगा.
इनप्लेस एन्क्रिप्शन की सुविधा चालू करने के लिए, vold एक लूप शुरू करता है. इससे, असली ब्लॉक डिवाइस के हर सेक्टर को पढ़ा जाता है. इसके बाद, इसे क्रिप्टो ब्लॉक डिवाइस में लिखा जाता है. vold किसी सेक्टर को पढ़ने और लिखने से पहले यह जांच करता है कि वह इस्तेमाल में है या नहीं. इससे, ऐसे नए डिवाइस पर एन्क्रिप्शन की प्रोसेस बहुत तेज़ी से होती है जिसमें बहुत कम या कोई डेटा नहीं होता.
डिवाइस की स्थिति: ro.crypto.state = "unencrypted" सेट करें
और बूटिंग जारी रखने के लिए, on nonencrypted init ट्रिगर को लागू करें.
- पासवर्ड की जांच करें
यूज़र इंटरफ़ेस (यूआई),
cryptfs enablecrypto inplaceकमांड के साथvoldको कॉल करता है. इसमेंpasswd, उपयोगकर्ता की लॉक स्क्रीन का पासवर्ड होता है. - फ़्रेमवर्क को हटाना
voldगड़बड़ियों की जांच करता है. अगर यह एन्क्रिप्ट (सुरक्षित) नहीं कर पाता है, तो -1 दिखाता है. साथ ही, लॉग में इसकी वजह प्रिंट करता है. अगर यह एन्क्रिप्ट (सुरक्षित) कर सकता है, तो यहvold.decryptप्रॉपर्टी कोtrigger_shutdown_frameworkपर सेट करता है. इससेinit.rc, क्लासlate_startऔरmainमें सेवाएं देना बंद कर देता है. - क्रिप्टो फ़ुटर बनाना
- ब्रेडक्रंब फ़ाइल बनाना
- रीबूट करें
- ब्रेडक्रंब फ़ाइल का पता लगाना
- डेटा को एन्क्रिप्ट (सुरक्षित) करना शुरू करें
/datavoldइसके बाद, क्रिप्टो मैपिंग सेट अप करता है. इससे एक वर्चुअल क्रिप्टो ब्लॉक डिवाइस बनता है. यह डिवाइस, असली ब्लॉक डिवाइस पर मैप करता है. हालांकि, यह हर सेक्टर को लिखते समय एन्क्रिप्ट (सुरक्षित) करता है और पढ़ते समय डिक्रिप्ट (सुरक्षित तरीके से जानकारी को वापस पाना) करता है.voldइसके बाद, क्रिप्टो मेटाडेटा बनाता है और उसे लिखता है. - डेटा को एन्क्रिप्ट (सुरक्षित) करते समय, tmpfs को माउंट करें
vold,/dataको tmpfs के तौर पर माउंट करता है (ro.crypto.tmpfs_optionsसे tmpfs के विकल्पों का इस्तेमाल करके) औरvold.encrypt_progressप्रॉपर्टी को 0 पर सेट करता है.voldएन्क्रिप्ट (सुरक्षित) किए गए सिस्टम को बूट करने के लिए, tmpfs/dataतैयार करता है. साथ ही,vold.decryptप्रॉपर्टी कोtrigger_restart_min_frameworkपर सेट करता है - प्रोग्रेस दिखाने के लिए फ़्रेमवर्क को ऊपर लाना
trigger_restart_min_frameworkकी वजह सेinit.rc,mainक्लास की सेवाएं शुरू करता है. जब फ़्रेमवर्क को पता चलता है किvold.encrypt_progressको 0 पर सेट किया गया है, तो वह प्रोग्रेस बार यूज़र इंटरफ़ेस (यूआई) दिखाता है. यह यूज़र इंटरफ़ेस (यूआई), हर पांच सेकंड में उस प्रॉपर्टी के लिए क्वेरी करता है और प्रोग्रेस बार को अपडेट करता है. एन्क्रिप्शन लूप,vold.encrypt_progressको तब अपडेट करता है, जब वह पार्टीशन के किसी दूसरे हिस्से को एन्क्रिप्ट (सुरक्षित) करता है. - जब
/dataएन्क्रिप्ट (सुरक्षित) किया गया हो, तब क्रिप्टो फ़ुटर अपडेट करें/dataके एन्क्रिप्ट (सुरक्षित) हो जाने के बाद,voldमेटाडेटा में मौजूद फ़्लैगENCRYPTION_IN_PROGRESSको हटा देता है.डिवाइस के अनलॉक होने के बाद, पासवर्ड का इस्तेमाल मास्टर पासकोड को एन्क्रिप्ट (सुरक्षित) करने के लिए किया जाता है. साथ ही, क्रिप्टो फ़ुटर को अपडेट किया जाता है.
अगर किसी वजह से रीबूट नहीं हो पाता है, तो
voldप्रॉपर्टीvold.encrypt_progressकोerror_reboot_failedपर सेट करता है. साथ ही, यूज़र इंटरफ़ेस (यूआई) पर एक मैसेज दिखना चाहिए, जिसमें उपयोगकर्ता से रीबूट करने के लिए बटन दबाने के लिए कहा गया हो. ऐसा कभी नहीं होना चाहिए.
डिफ़ॉल्ट एन्क्रिप्शन के साथ एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को शुरू करना
जब किसी एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को बिना पासवर्ड के बूट अप किया जाता है, तो ऐसा होता है. Android 5.0 वाले डिवाइसों को पहली बार बूट करने पर एन्क्रिप्ट (सुरक्षित) किया जाता है. इसलिए, कोई पासवर्ड सेट नहीं होना चाहिए. इसलिए, यह डिफ़ॉल्ट एन्क्रिप्शन की स्थिति है.
- बिना पासवर्ड के एन्क्रिप्ट (सुरक्षित) किए गए
/dataका पता लगानायह पता लगाना कि Android डिवाइस को एन्क्रिप्ट (सुरक्षित) किया गया है, क्योंकि
/dataको माउंट नहीं किया जा सकता औरencryptableयाforceencryptमें से कोई एक फ़्लैग सेट किया गया है.vold,vold.decryptकोtrigger_default_encryptionपर सेट करता है. इससेdefaultcryptoसेवा शुरू हो जाती है.trigger_default_encryptionएन्क्रिप्शन के टाइप की जांच करता है, ताकि यह पता चल सके कि/dataको पासवर्ड के साथ या उसके बिना एन्क्रिप्ट (सुरक्षित) किया गया है. - /data को डिक्रिप्ट करें
यह कुकी, ब्लॉक किए गए डिवाइस पर
dm-cryptडिवाइस बनाती है, ताकि डिवाइस का इस्तेमाल किया जा सके. - /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में सेवाएं शुरू कर देता है. - फ़्रेमवर्क शुरू करें
अब फ़्रेमवर्क, डिक्रिप्ट किए गए
/dataका इस्तेमाल करके अपनी सभी सेवाओं को बूट करता है. इसके बाद, सिस्टम इस्तेमाल के लिए तैयार हो जाता है.
डिफ़ॉल्ट एन्क्रिप्शन के बिना एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को चालू करना
जब एन्क्रिप्ट (सुरक्षित) किए गए किसी ऐसे डिवाइस को बूट किया जाता है जिस पर पासवर्ड सेट है, तो ऐसा होता है. डिवाइस का पासवर्ड, पिन, पैटर्न या पासवर्ड हो सकता है.
- पासवर्ड की मदद से एन्क्रिप्ट किए गए डिवाइस का पता लगाना
यह पता लगाना कि Android डिवाइस को एन्क्रिप्ट (सुरक्षित) किया गया है, क्योंकि फ़्लैग
ro.crypto.state = "encrypted"vold,vold.decryptकोtrigger_restart_min_frameworkपर सेट करता है, क्योंकि/dataको पासवर्ड से एन्क्रिप्ट (सुरक्षित) किया जाता है. - tmpfs को माउंट करना
init, पांच प्रॉपर्टी सेट करता है. इनका इस्तेमाल,/dataके लिए दिए गए शुरुआती माउंट विकल्पों को सेव करने के लिए किया जाता है. साथ ही,init.rcसे पास किए गए पैरामीटर को भी सेव किया जाता है.vold, क्रिप्टो मैपिंग सेट अप करने के लिए इन प्रॉपर्टी का इस्तेमाल करता है:ro.crypto.fs_typero.crypto.fs_real_blkdevro.crypto.fs_mnt_pointro.crypto.fs_optionsro.crypto.fs_flags(ASCII में आठ अंकों की हेक्स संख्या, जिसके पहले 0x लिखा हो)
- पासवर्ड डालने के लिए प्रॉम्प्ट दिखाने वाला फ़्रेमवर्क शुरू करना
फ़्रेमवर्क शुरू होता है और देखता है कि
vold.decryptकोtrigger_restart_min_frameworkपर सेट किया गया है. इससे फ़्रेमवर्क को पता चलता है कि यह tmpfs/dataडिस्क पर बूट हो रहा है और इसे उपयोगकर्ता का पासवर्ड चाहिए.हालांकि, इससे पहले यह पक्का करना ज़रूरी है कि डिस्क को सही तरीके से एन्क्रिप्ट (सुरक्षित) किया गया हो. यह
cryptfs cryptocompleteकोvoldकमांड भेजता है.voldअगर एन्क्रिप्शन की प्रोसेस पूरी हो गई है, तो 0 दिखाता है. अगर कोई अंदरूनी गड़बड़ी हुई है, तो -1 दिखाता है. अगर एन्क्रिप्शन की प्रोसेस पूरी नहीं हुई है, तो -2 दिखाता है.vold,CRYPTO_ENCRYPTION_IN_PROGRESSफ़्लैग के लिए क्रिप्टो मेटाडेटा की जांच करके यह तय करता है. अगर यह सेट है, तो एन्क्रिप्शन की प्रोसेस में रुकावट आई है. साथ ही, डिवाइस पर इस्तेमाल किया जा सकने वाला कोई डेटा मौजूद नहीं है. अगरvoldसे कोई गड़बड़ी होती है, तो यूज़र इंटरफ़ेस (यूआई) को उपयोगकर्ता को एक मैसेज दिखाना चाहिए. इसमें डिवाइस को रीबूट करने और फ़ैक्ट्री रीसेट करने के बारे में बताया गया हो. साथ ही, उपयोगकर्ता को ऐसा करने के लिए एक बटन देना चाहिए. - पासवर्ड की मदद से डेटा को डिक्रिप्ट करना
cryptfs cryptocompleteपूरा होने के बाद, फ़्रेमवर्क एक यूज़र इंटरफ़ेस (यूआई) दिखाता है. इसमें डिस्क का पासवर्ड मांगा जाता है. यूज़र इंटरफ़ेस, पासवर्ड की जांच करता है. इसके लिए, वहvoldकोcryptfs checkpwकमांड भेजता है. अगर पासवर्ड सही है (इसका पता इस बात से चलता है कि डिक्रिप्ट किए गए/dataको किसी अस्थायी जगह पर माउंट किया गया है और फिर अनमाउंट किया गया है), तोvold, डिक्रिप्ट किए गए ब्लॉक डिवाइस का नाम,ro.crypto.fs_crypto_blkdevप्रॉपर्टी में सेव करता है और यूज़र इंटरफ़ेस (यूआई) को स्टेटस 0 दिखाता है. अगर पासवर्ड गलत है, तो यह यूज़र इंटरफ़ेस (यूआई) को -1 दिखाता है. - स्टॉप फ़्रेमवर्क
यूज़र इंटरफ़ेस (यूआई) पर क्रिप्टो बूट ग्राफ़िक दिखता है. इसके बाद,
cryptfs restartकमांड के साथvoldको कॉल करता है.vold,vold.decryptप्रॉपर्टी कोtrigger_reset_mainपर सेट करता है. इससेinit.rc,class_reset mainकरता है. इससे मुख्य क्लास में मौजूद सभी सेवाएं बंद हो जाती हैं. इससे tmpfs/dataको अनमाउंट किया जा सकता है. - माउंट
/datavoldइसके बाद, डिक्रिप्ट किए गए असली/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में सेवाएं शुरू कर देता है. - पूरा फ़्रेमवर्क इस्तेमाल करना शुरू करें
अब फ़्रेमवर्क, डिक्रिप्ट किए गए
/dataफ़ाइल सिस्टम का इस्तेमाल करके अपनी सभी सेवाओं को बूट करता है. इसके बाद, सिस्टम इस्तेमाल के लिए तैयार हो जाता है.
कार्रवाई सफल नहीं हुई
डिक्रिप्ट न हो पाने वाले डिवाइस में कुछ समस्याएं हो सकती हैं. डिवाइस बूट करने के लिए, सामान्य चरणों की सीरीज़ शुरू होती है:
- पासवर्ड की मदद से एन्क्रिप्ट किए गए डिवाइस का पता लगाना
- tmpfs को माउंट करना
- पासवर्ड के लिए प्रॉम्प्ट करने वाला फ़्रेमवर्क शुरू करें
हालांकि, फ़्रेमवर्क खुलने के बाद, डिवाइस में कुछ गड़बड़ियां हो सकती हैं:
- पासवर्ड सही है, लेकिन डेटा को डिक्रिप्ट नहीं किया जा सकता
- उपयोगकर्ता 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 लागू करके जनरेट की गई कुंजी का इस्तेमाल करते थे. की को ऑफ़-बॉक्स हमलों से बचाने के लिए, हम इस एल्गोरिदम को बढ़ाते हैं. इसके लिए, हम नतीजे के तौर पर मिली की को सेव की गई टीईई की से साइन करते हैं. इसके बाद, scrypt को एक और ऐप्लिकेशन पर लागू करके, नतीजे के तौर पर मिले हस्ताक्षर को सही लंबाई वाली कुंजी में बदल दिया जाता है. इसके बाद, इस कुंजी का इस्तेमाल मास्टर कुंजी को एन्क्रिप्ट (सुरक्षित) और डिक्रिप्ट करने के लिए किया जाता है. इस कुंजी को सेव करने के लिए:
- 16 बाइट की रैंडम डिस्क एन्क्रिप्शन की (डीईके) और 16 बाइट का सॉल्ट जनरेट करें.
- उपयोगकर्ता के पासवर्ड और सॉल्ट पर scrypt लागू करें, ताकि 32 बाइट का इंटरमीडिएट की 1 (IK1) जनरेट किया जा सके.
- हार्डवेयर से बंधी निजी कुंजी (एचबीके) के साइज़ के बराबर करने के लिए, IK1 में शून्य बाइट जोड़ें. खास तौर पर, हम इस तरह से पैडिंग करते हैं: 00 || IK1 || 00..00; एक ज़ीरो बाइट, 32 IK1 बाइट, 223 ज़ीरो बाइट.
- पैडेड IK1 को HBK के साथ साइन करके, 256 बाइट का IK2 जनरेट करें.
- IK2 और सॉल्ट (दूसरे चरण वाला सॉल्ट) पर scrypt लागू करके, 32 बाइट का IK3 जनरेट करें.
- IK3 के पहले 16 बाइट को KEK और आखिरी 16 बाइट को IV के तौर पर इस्तेमाल करें.
- केईके और इनिशलाइज़ेशन वेक्टर 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 |
इस कुकी को vold सेट करता है, ताकि /data को ज़रूरी डायरेक्ट्री वगैरह के साथ तैयार किया जा सके. |
vold.decrypt trigger_restart_framework |
इस कुकी को vold सेट करता है, ताकि असली फ़्रेमवर्क और सभी सेवाएं शुरू की जा सकें. |
vold.decrypt trigger_shutdown_framework |
इस कुकी को vold सेट करता है. इसका इस्तेमाल पूरे फ़्रेमवर्क को बंद करने के लिए किया जाता है, ताकि एन्क्रिप्शन शुरू किया जा सके. |
vold.decrypt trigger_restart_min_framework |
इस कुकी को vold सेट करता है. इसका इस्तेमाल, एन्क्रिप्शन के लिए प्रोग्रेस बार यूज़र इंटरफ़ेस (यूआई) शुरू करने या पासवर्ड के लिए प्रॉम्प्ट दिखाने के लिए किया जाता है. यह 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 ने सेट किया था. इसे vold.decrypt को trigger_post_fs_data पर सेट करने से ठीक पहले सेट किया गया था. |
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 के साथ काम कर रहा है. |
|
इन पांच प्रॉपर्टी को 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