पूरे डिस्क को एन्क्रिप्ट करने की प्रोसेस में, एन्क्रिप्ट की गई कुंजी का इस्तेमाल करके, 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 डिवाइस के लिए, पहली बार बूट होने की यह सामान्य प्रक्रिया है.
forceencrypt
फ़्लैग की मदद से, एन्क्रिप्ट (सुरक्षित) नहीं किए गए फ़ाइल सिस्टम का पता लगाएं/data
को एन्क्रिप्ट (सुरक्षित) नहीं किया गया है, क्योंकिforceencrypt
के लिए यह ज़रूरी है./data
को अनमाउंट करें./data
को एन्क्रिप्ट करना शुरू करनाvold.decrypt = "trigger_encryption"
,init.rc
को ट्रिगर करता है, इसकी वजह सेvold
,/data
को बिना पासवर्ड के एन्क्रिप्ट करता है. (कोई सेट नहीं है, क्योंकि यह नया डिवाइस होना चाहिए.)- tmpfs को माउंट करना
vold
, tmpfs/data
को माउंट करता है (इसके लिए tmpfs विकल्पों का इस्तेमाल करता हैro.crypto.tmpfs_options
) प्रॉपर्टी कोvold.encrypt_progress
प्रॉपर्टी के तौर पर 0 पर सेट किया जाता है.vold
, एन्क्रिप्ट (सुरक्षित) किए गए सिस्टम को चालू करने के लिए, tmpfs/data
को तैयार करता है और प्रॉपर्टीvold.decrypt
इससे:trigger_restart_min_framework
- प्रोग्रेस दिखाने के लिए फ़्रेमवर्क तैयार करना
डिवाइस में एन्क्रिप्ट (सुरक्षित) करने के लिए कोई डेटा मौजूद नहीं है. इसलिए, प्रोग्रेस बार वे अक्सर इसलिए दिखते हैं, क्योंकि एन्क्रिप्ट (सुरक्षित) करने में बहुत ज़्यादा समय लगता है. यहां जाएं: ज़्यादा जानकारी के लिए, मौजूदा डिवाइस को एन्क्रिप्ट (सुरक्षित) करें प्रोग्रेस यूज़र इंटरफ़ेस (यूआई) की जानकारी.
/data
के एन्क्रिप्ट (सुरक्षित) होने पर, फ़्रेमवर्क को हटा देंvold
,vold.decrypt
को इस पर सेट करता हैtrigger_default_encryption
जोdefaultcrypto
सेवा. (यह एन्क्रिप्ट (सुरक्षित) किए गए डिफ़ॉल्ट उपयोगकर्ता डेटा को माउंट करने के लिए, नीचे दिया गया फ़्लो शुरू करता है.)trigger_default_encryption
एन्क्रिप्ट (सुरक्षित) करने का तरीका, ताकि यह देखा जा सके कि/data
को पासवर्ड डालें. Android 5.0 डिवाइस को पहली बार बूट करने पर एन्क्रिप्ट (सुरक्षित) किया जाता है, इसलिए ऐसा होना चाहिए पासवर्ड सेट न हो; इसलिए, हम/data
को डिक्रिप्ट और डिक्रिप्ट करते हैं.- माउंट करें
/data
इसके बाद,
init
इसका इस्तेमाल करके/data
को tmpfs रैम डिस्क पर माउंट करता है पैरामीटर, जिसे यहro.crypto.tmpfs_options
से चुनता है, जो कि एक बार सेट हैinit.rc
में. - Start फ़्रेमवर्क
vold
,vold.decrypt
कोtrigger_restart_framework
पर सेट करता है, जिससे सामान्य बूट प्रोसेस जारी रहती है.
मौजूदा डिवाइस एन्क्रिप्ट (सुरक्षित) करें
ऐसा तब होता है, जब एन्क्रिप्ट (सुरक्षित) नहीं किए गए Android K या इससे पहले के वर्शन को एन्क्रिप्ट (सुरक्षित) किया जाता है L पर माइग्रेट किया गया डिवाइस.
यह प्रोसेस उपयोगकर्ता की ओर से शुरू की जाती है. इसे कोड डालें. जब कोई उपयोगकर्ता किसी डिवाइस को एन्क्रिप्ट करने का विकल्प चुनता है, तो यूज़र इंटरफ़ेस (यूआई) यह पक्का करता है कि डिवाइस की बैटरी पूरी तरह चार्ज हो और AC अडैप्टर प्लग इन हो, ताकि एन्क्रिप्शन की प्रोसेस पूरी करने के लिए ज़रूरत के मुताबिक बैटरी हो.
चेतावनी: अगर डिवाइस की बैटरी खत्म हो जाती है और काम खत्म होने से पहले यह बंद हो जाता है, तो एन्क्रिप्ट करने के दौरान, फ़ाइल का डेटा कुछ हद तक एन्क्रिप्ट यानी सुरक्षित किया जाता है. डिवाइस को फ़ैक्ट्री रीसेट करना ज़रूरी है. ऐसा करने पर, डिवाइस का सारा डेटा मिट जाता है.
जगह की जानकारी को एन्क्रिप्ट (सुरक्षित) करने की सुविधा चालू करने के लिए, 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
क्लास में सेवाओं को रोक देती है. - क्रिप्टो फ़ुटर बनाना
- ब्रेडक्रंब फ़ाइल बनाना
- रीबूट करें
- ब्रेडक्रंब फ़ाइल का पता लगाना
/data
को एन्क्रिप्ट (सुरक्षित) करना शुरू करेंvold
इसके बाद, क्रिप्टो मैपिंग सेट अप करता है. इससे एक वर्चुअल क्रिप्टो ब्लॉक डिवाइस बनता है, जो असली ब्लॉक डिवाइस पर मैप होता है. हालांकि, इसमें हर सेक्टर को लिखते समय एन्क्रिप्ट किया जाता है और पढ़ते समय डिक्रिप्ट किया जाता है. इसके बाद,vold
क्रिप्टो मेटाडेटा बनाता है और उसे लिखता है.- एन्क्रिप्ट करने के दौरान, tmpfs को माउंट करना
vold
, tmpfs के विकल्पों का इस्तेमाल करके/data
को माउंट करता हैro.crypto.tmpfs_options
से) और प्रॉपर्टी सेट करता हैvold.encrypt_progress
से 0 तक.vold
tmpf तैयार करता है एन्क्रिप्ट किए गए सिस्टम को चालू करने और प्रॉपर्टी को सेट करने के लिए/data
vold.decrypt
से:trigger_restart_min_framework
- प्रोग्रेस दिखाने के लिए फ़्रेमवर्क तैयार करना
trigger_restart_min_framework
के कारणinit.rc
की वजह सेmain
सेवाओं की श्रेणी शुरू करें. जब फ़्रेमवर्क देखता है किvold.encrypt_progress
को 0 पर सेट किया गया है. इससे प्रोग्रेस बार दिखेगा यूज़र इंटरफ़ेस (यूआई), जो हर पांच सेकंड में उस प्रॉपर्टी के लिए क्वेरी करता है और एक प्रोग्रेस बार को अपडेट करता है. एन्क्रिप्शन लूप, हर बार partition का एक और प्रतिशत एन्क्रिप्ट करने पर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
में अपनी सेवाएं फिर से शुरू करें बूट के बाद से समय. - Start फ़्रेमवर्क
अब फ़्रेमवर्क, डिक्रिप्ट किए गए
/data
का इस्तेमाल करके अपनी सभी सेवाओं को बूट करता है और सिस्टम इस्तेमाल के लिए तैयार हो जाता है.
एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस को डिफ़ॉल्ट एन्क्रिप्शन के बिना चालू करना
ऐसा तब होता है, जब आप ऐसे एन्क्रिप्ट किए गए डिवाइस को चालू करते हैं जिसमें पासवर्ड डालें. डिवाइस का पासवर्ड, पिन, पैटर्न या पासवर्ड हो सकता है.
- पासवर्ड से एन्क्रिप्ट (सुरक्षित) किए गए डिवाइस का पता लगाना
पता लगाएं कि Android डिवाइस को एनक्रिप्ट (सुरक्षित) किया गया है, क्योंकि
ro.crypto.state = "encrypted"
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया हैvold
,vold.decrypt
कोtrigger_restart_min_framework
पर सेट करता है, क्योंकि/data
को पासवर्ड से एन्क्रिप्ट (सुरक्षित) किया गया है. - माउंट टीएमपीएफ़एस
init
, माउंट करने के शुरुआती विकल्पों को सेव करने के लिए, पांच प्रॉपर्टी सेट करता हैinit.rc
से पास किए गए पैरामीटर के साथ/data
के लिए दिया गया.vold
क्रिप्टो मैपिंग सेट अप करने के लिए इन प्रॉपर्टी का इस्तेमाल करता है:ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags
(ASCII में 0x से पहले आठ अंकों वाला हेक्स नंबर)
- पासवर्ड के प्रॉम्प्ट के लिए फ़्रेमवर्क शुरू करें
फ़्रेमवर्क शुरू होता है और पता चलता है कि
vold.decrypt
इस पर सेट हैtrigger_restart_min_framework
. इससे फ़्रेमवर्क को पता चलता है कि वह/data
डिस्क पर बूट हो रहा है और उसे उपयोगकर्ता का पासवर्ड चाहिए.हालांकि, सबसे पहले यह पक्का करना होगा कि डिस्क को सही तरीके से एन्क्रिप्ट (सुरक्षित) किया गया हो. यह
vold
कोcryptfs cryptocomplete
निर्देश भेजता है. अगर एन्क्रिप्ट (सुरक्षित) करने की प्रोसेस पूरी हो गई है, तो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
को अनमाउंट किया जा सकता है. - माउंट
/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 का एक और इस्तेमाल करके, नतीजे में मिले हस्ताक्षर को सही लंबाई वाली कुंजी में बदल दिया जाता है. इसके बाद, एन्क्रिप्ट (सुरक्षित) करने के लिए इस कुंजी का इस्तेमाल किया जाता है और मास्टर कुंजी को डिक्रिप्ट कर सकता है. इस पासकोड को सेव करने के लिए:
- 16-बाइट की रैंडम डिस्क एन्क्रिप्शन पासकोड (डीईके) और 16-बाइट का नमक जनरेट करें.
- उपयोगकर्ता के पासवर्ड और नमक पर स्क्रिप्ट लागू करें, ताकि 32-बाइट इंटरमीडिएट की 1 (IK1) बनाई जा सके.
- IK1 को शून्य बाइट के साथ, हार्डवेयर से जुड़ी निजी कुंजी (HBK) के साइज़ तक पैड करें. खास तौर पर, हम इस तरह पैड करते हैं: 00 || IK1 || 00..00; एक शून्य बाइट, 32 IK1 बाइट, 223 शून्य बाइट.
- 256-बाइट का IK2 बनाने के लिए, पैड किए गए IK1 को HBK के साथ साइन करें.
- 32-बाइट का IK3 बनाने के लिए, IK2 और नमक (दूसरे चरण में इस्तेमाल किए गए नमक के जैसे) पर स्क्रिप्ट लागू करें.
- IK3 की शुरुआती 16 बाइट का इस्तेमाल KEK और आखिरी 16 बाइट को IV के तौर पर करें.
- 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 के साथ चल रहा है. |
|
ये पांच प्रॉपर्टी
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