फ़ुल-डिस्क एन्क्रिप्शन, Android डिवाइस पर मौजूद उपयोगकर्ता के पूरे डेटा को एन्क्रिप्ट (सुरक्षित) की गई कुंजी का इस्तेमाल करके एन्कोड करने की प्रोसेस है. किसी डिवाइस को एन्क्रिप्ट (सुरक्षित) करने के बाद, उपयोगकर्ता का बनाया गया सारा डेटा अपने-आप एन्क्रिप्ट (सुरक्षित) हो जाता है. इसके बाद, इसे डिस्क में सेव किया जाता है. साथ ही, सभी रीड प्रोसेस, डेटा को अपने-आप डिक्रिप्ट (सुरक्षित किए गए डेटा को सामान्य डेटा में बदलना) करती हैं. इसके बाद, इसे कॉल करने वाली प्रोसेस को वापस भेजती हैं.
Android 4.4 में, पूरे डिस्क को एन्क्रिप्ट (सुरक्षित) करने की सुविधा पेश की गई थी. हालांकि, Android 5.0 में ये नई सुविधाएं पेश की गई थीं:
- तेज़ी से एन्क्रिप्ट (सुरक्षित) करने की सुविधा बनाई गई है. यह सुविधा, डेटा पार्टीशन पर इस्तेमाल किए गए ब्लॉक को ही एन्क्रिप्ट (सुरक्षित) करती है, ताकि पहली बार बूट होने में ज़्यादा समय न लगे. फ़िलहाल, सिर्फ़ ext4 और f2fs फ़ाइलसिस्टम में फ़ास्ट एन्क्रिप्शन की सुविधा काम करती है.
- पहले बूट पर एन्क्रिप्ट (सुरक्षित) करने के लिए,
forceencrypt
fstab फ़्लैग जोड़ा गया. - बिना पासवर्ड के पैटर्न और एन्क्रिप्शन की सुविधा जोड़ी गई है.
- ट्रस्टेड एक्ज़ीक्यूशन एनवायरमेंट (टीईई) की साइनिंग सुविधा (जैसे कि 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
को अनमाउंट करें.- डेटा को एन्क्रिप्ट (सुरक्षित) करना शुरू करें
/data
vold.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
के एन्क्रिप्ट (सुरक्षित) होने पर, फ़्रेमवर्क को हटा देंvold
vold.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
में सेवाएं देना बंद कर देता है. - क्रिप्टो फ़ुटर बनाना
- ब्रेडक्रंब फ़ाइल बनाना
- रीबूट करें
- ब्रेडक्रंब फ़ाइल का पता लगाना
- डेटा को एन्क्रिप्ट (सुरक्षित) करना शुरू करें
/data
vold
इसके बाद, क्रिप्टो मैपिंग सेट अप करता है. इससे एक वर्चुअल क्रिप्टो ब्लॉक डिवाइस बनता है. यह डिवाइस, असली ब्लॉक डिवाइस पर मैप करता है. हालांकि, यह हर सेक्टर को लिखते समय एन्क्रिप्ट (सुरक्षित) करता है और पढ़ते समय डिक्रिप्ट (सुरक्षित तरीके से जानकारी को वापस पाना) करता है.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_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
पर सेट किया गया है. इससे फ़्रेमवर्क को पता चलता है कि यह 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
को अनमाउंट किया जा सकता है. - माउंट
/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