फ़ुल-डिस्क एन्क्रिप्शन, 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 Advanced Encryption Standard (AES) है. इसमें साइफ़र-ब्लॉक चेनिंग (सीबीसी) और ESSIV:SHA256 का इस्तेमाल किया जाता है. मास्टर कुंजी को OpenSSL लाइब्रेरी को कॉल करके, 128-बिट AES की मदद से एन्क्रिप्ट (सुरक्षित) किया जाता है. आपको कुंजी के लिए 128 बिट या इससे ज़्यादा का इस्तेमाल करना होगा. हालांकि, 256 बिट का इस्तेमाल करना ज़रूरी नहीं है.
ध्यान दें: ओईएम, मास्टर कुंजी को एन्क्रिप्ट (सुरक्षित) करने के लिए 128-बिट या इससे ज़्यादा बिट का इस्तेमाल कर सकते हैं.
Android 5.0 रिलीज़ में, एन्क्रिप्शन की चार स्थितियां होती हैं:
- डिफ़ॉल्ट
- पिन
- पासवर्ड
- पैटर्न
पहली बार बूट करने पर, डिवाइस 128-बिट की मास्टर कुंजी बनाता है. इसके बाद, यह इसे डिफ़ॉल्ट पासवर्ड और सेव किए गए सॉल्ट के साथ हैश करता है. डिफ़ॉल्ट पासवर्ड यह है: "default_password" हालांकि, नतीजे के तौर पर मिले हैश पर टीईई (जैसे कि TrustZone) के ज़रिए भी हस्ताक्षर किया जाता है. यह मास्टर की को एन्क्रिप्ट करने के लिए, हस्ताक्षर के हैश का इस्तेमाल करता है.
Android ओपन सोर्स प्रोजेक्ट की 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 डिवाइस के लिए, यह सामान्य फ़र्स्ट बूट है.
forceencryptफ़्लैग की मदद से, बिना एन्क्रिप्ट किए गए फ़ाइल सिस्टम का पता लगाना/dataको एन्क्रिप्ट (सुरक्षित) नहीं किया गया है. हालांकि,forceencryptके लिए ऐसा करना ज़रूरी है. अनमाउंट करें/data.- डेटा को एन्क्रिप्ट (सुरक्षित) करना शुरू करें
/datavold.decrypt = "trigger_encryption"ट्रिगर करता हैinit.rc, जिससेvold,/dataको बिना पासवर्ड के एन्क्रिप्ट (सुरक्षित) करता है. (कोई भी डिवाइस सेट नहीं है, क्योंकि यह नया डिवाइस होना चाहिए.) - tmpfs को माउंट करना
vold,/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से पैरामीटर लेता है. को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 को माउंट करें
voldtmpfs को माउंट करता है/data(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पूरा होने के बाद, फ़्रेमवर्क एक यूज़र इंटरफ़ेस (यूआई) दिखाता है. इसमें डिस्क का पासवर्ड मांगा जाता है. यूज़र इंटरफ़ेस, पासवर्ड की जांच करता है. इसके लिए, वहcryptfs checkpwकोvoldकमांड भेजता है. अगर पासवर्ड सही है (इसका पता इस बात से चलता है कि डिक्रिप्ट किए गए/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को अनमाउंट किया जा सकता है. - माउंट करें
/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फ़ाइल सिस्टम का इस्तेमाल करके अपनी सभी सेवाओं को बूट करता है. इसके बाद, सिस्टम इस्तेमाल के लिए तैयार हो जाता है.
पेज लोड नहीं हो सका
डिक्रिप्ट न हो पाने वाले डिवाइस में कुछ समस्याएं हो सकती हैं. डिवाइस, बूट करने के लिए सामान्य चरणों की सीरीज़ से शुरू होता है:
- पासवर्ड की मदद से एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस का पता लगाना
- 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