पूर्ण-डिस्क एन्क्रिप्शन एक एन्क्रिप्टेड कुंजी का उपयोग करके एंड्रॉइड डिवाइस पर सभी उपयोगकर्ता डेटा को एन्कोड करने की प्रक्रिया है। एक बार एक डिवाइस एन्क्रिप्ट हो जाने के बाद, सभी उपयोगकर्ता-निर्मित डेटा को डिस्क पर जमा करने से पहले स्वचालित रूप से एन्क्रिप्ट किया जाता है और कॉलिंग प्रक्रिया में लौटने से पहले डेटा को स्वचालित रूप से डिक्रिप्ट किया जाता है।
फुल-डिस्क एन्क्रिप्शन को एंड्रॉइड में 4.4 में पेश किया गया था, लेकिन एंड्रॉइड 5.0 ने इन नई सुविधाओं को पेश किया:
- तेजी से एन्क्रिप्शन बनाया गया, जो केवल डेटा विभाजन पर उपयोग किए गए ब्लॉक को एन्क्रिप्ट करता है ताकि पहले बूट में लंबा समय न लगे। वर्तमान में केवल ext4 और f2fs फ़ाइल सिस्टम तेज़ एन्क्रिप्शन का समर्थन करते हैं।
- पहले बूट पर एन्क्रिप्ट करने के लिए
forceencrypt
fstab फ़्लैग जोड़ा गया। - पासवर्ड के बिना पैटर्न और एन्क्रिप्शन के लिए जोड़ा गया समर्थन।
- ट्रस्टेड एक्ज़ीक्यूशन एनवायरनमेंट (टीईई) साइनिंग क्षमता (जैसे ट्रस्टज़ोन में) का उपयोग करके एन्क्रिप्शन कुंजी का हार्डवेयर-समर्थित स्टोरेज जोड़ा गया। अधिक विवरण के लिए एन्क्रिप्टेड कुंजी को संग्रहित करना देखें।
सावधानी: Android 5.0 में अपग्रेड किए गए और फिर एन्क्रिप्ट किए गए डिवाइस फ़ैक्टरी डेटा रीसेट द्वारा एन्क्रिप्टेड स्थिति में वापस आ सकते हैं। पहले बूट पर एन्क्रिप्ट किए गए नए Android 5.0 डिवाइस को अनएन्क्रिप्टेड स्थिति में नहीं लौटाया जा सकता।
Android पूर्ण-डिस्क एन्क्रिप्शन कैसे काम करता है
एंड्रॉइड फुल-डिस्क एन्क्रिप्शन dm-crypt
पर आधारित है, जो एक कर्नेल विशेषता है जो ब्लॉक डिवाइस लेयर पर काम करती है। इस वजह से, एन्क्रिप्शन एंबेडेड मल्टीमीडिया कार्ड ( eMMC) और इसी तरह के फ्लैश डिवाइस के साथ काम करता है जो खुद को ब्लॉक डिवाइस के रूप में कर्नेल में पेश करते हैं। YAFFS के साथ एन्क्रिप्शन संभव नहीं है, जो सीधे कच्चे नंद फ्लैश चिप से बात करता है।
एन्क्रिप्शन एल्गोरिथ्म 128 उन्नत एन्क्रिप्शन स्टैंडर्ड (AES) है जिसमें सिफर-ब्लॉक चेनिंग (CBC) और ESSIV: SHA256 है। ओपनएसएसएल लाइब्रेरी में कॉल के माध्यम से मास्टर कुंजी को 128-बिट एईएस के साथ एन्क्रिप्ट किया गया है। कुंजी के लिए आपको 128 बिट्स या अधिक का उपयोग करना चाहिए (256 वैकल्पिक होने के साथ)।
नोट: मास्टर कुंजी को एन्क्रिप्ट करने के लिए ओईएम 128-बिट या उच्चतर का उपयोग कर सकते हैं।
Android 5.0 रिलीज़ में, चार प्रकार की एन्क्रिप्शन अवस्थाएँ हैं:
- चूक जाना
- नत्थी करना
- कूटशब्द
- नमूना
पहले बूट पर, डिवाइस बेतरतीब ढंग से उत्पन्न 128-बिट मास्टर कुंजी बनाता है और फिर इसे डिफ़ॉल्ट पासवर्ड और संग्रहीत नमक के साथ हैश करता है। डिफ़ॉल्ट पासवर्ड है: "default_password" हालांकि, परिणामी हैश को टीईई (जैसे ट्रस्टज़ोन) के माध्यम से भी हस्ताक्षरित किया जाता है, जो मास्टर कुंजी को एन्क्रिप्ट करने के लिए हस्ताक्षर के हैश का उपयोग करता है।
आप Android ओपन सोर्स प्रोजेक्ट cryptfs.cpp फ़ाइल में परिभाषित डिफ़ॉल्ट पासवर्ड पा सकते हैं।
जब उपयोगकर्ता डिवाइस पर पिन/पास या पासवर्ड सेट करता है, तो केवल 128-बिट कुंजी को फिर से एन्क्रिप्ट और संग्रहीत किया जाता है। (यानी। उपयोगकर्ता पिन/पास/पैटर्न परिवर्तन उपयोगकर्ता डेटा के पुन: एन्क्रिप्शन का कारण नहीं बनते हैं।) ध्यान दें कि प्रबंधित डिवाइस पिन, पैटर्न या पासवर्ड प्रतिबंधों के अधीन हो सकता है।
एन्क्रिप्शन init
और vold
द्वारा प्रबंधित किया जाता है। init
कॉल vold
, और vold init में ईवेंट ट्रिगर करने के लिए गुण सेट करता है। सिस्टम के अन्य भाग भी रिपोर्ट की स्थिति, पासवर्ड के लिए पूछने, या घातक त्रुटि के मामले में फ़ैक्टरी रीसेट करने का संकेत देने जैसे कार्यों को संचालित करने के लिए गुणों को देखते हैं। vold
में एन्क्रिप्शन सुविधाओं का आह्वान करने के लिए, सिस्टम कमांड लाइन टूल vdc
के cryptfs
कमांड का उपयोग करता है: checkpw
, restart
करें , enablecrypto
, changepw
, cryptocomplete
, getpw
pw , setfield
, verifypw
, getfield
, mountdefaultencrypted
, getpwtype
, और 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 K और पहले का)।
-
- एक एन्क्रिप्टेड डिवाइस बूट करें:
- बिना पासवर्ड वाले एन्क्रिप्टेड डिवाइस को शुरू करना: एक एन्क्रिप्टेड डिवाइस को बूट करना जिसमें कोई सेट पासवर्ड नहीं है (एंड्रॉइड 5.0 और बाद में चलने वाले डिवाइस के लिए प्रासंगिक)।
- एक पासवर्ड के साथ एक एन्क्रिप्टेड डिवाइस शुरू करना: एक एन्क्रिप्टेड डिवाइस को बूट करना जिसमें एक सेट पासवर्ड है।
इन प्रवाहों के अतिरिक्त, उपकरण /data
को एन्क्रिप्ट करने में भी विफल हो सकता है। प्रत्येक प्रवाह को नीचे विस्तार से समझाया गया है।
फोर्सएनक्रिप्ट के साथ एक नए डिवाइस को एन्क्रिप्ट करें
Android 5.0 डिवाइस के लिए यह सामान्य पहला बूट है।
-
forceencrypt
फ्लैग के साथ अनएन्क्रिप्टेड फाइल सिस्टम का पता लगाएं/data
एन्क्रिप्ट नहीं किया गया है, लेकिन इसकी आवश्यकता है क्योंकि इसेforceencrypt
करने के लिए बाध्य किया गया है। अनमाउंट/data
। - एन्क्रिप्ट
/data
प्रारंभ करेंvold.decrypt = "trigger_encryption"
init.rc
है, जो बिना किसी पासवर्ड केvold
को encrypt/data
कर देगा। (कोई भी सेट नहीं है क्योंकि यह एक नया डिवाइस होना चाहिए।) - टीएमपीएफ माउंट करें
vold
एक tmpfs/data
(ro.crypto.tmpfs_options
से tmpfs विकल्पों का उपयोग करके) को आरोहित करता है और गुणvold.encrypt_progress
को 0 पर सेट करता है।vold
एक एन्क्रिप्टेड सिस्टम को बूट करने के लिए tmpfs/data
तैयार करता है औरvold.decrypt
गुण को यहां सेट करता है:trigger_restart_min_framework
- प्रगति दिखाने के लिए रूपरेखा तैयार करें
चूंकि डिवाइस में एन्क्रिप्ट करने के लिए वस्तुतः कोई डेटा नहीं है, इसलिए प्रगति बार वास्तव में दिखाई नहीं देगा क्योंकि एन्क्रिप्शन इतनी जल्दी होता है। प्रगति UI के बारे में अधिक विवरण के लिए किसी मौजूदा डिवाइस को एन्क्रिप्ट करें देखें।
- जब
/data
एन्क्रिप्ट किया जाता है, तो ढांचे को नीचे ले जाएंvold
vold.decrypt
कोtrigger_default_encryption
पर सेट करता है जोdefaultcrypto
सेवा शुरू करता है। (यह डिफॉल्ट एन्क्रिप्टेड यूजरडेटा को माउंट करने के लिए नीचे प्रवाह शुरू करता है।)trigger_default_encryption
यह देखने के लिए एन्क्रिप्शन प्रकार की जांच करता है कि/data
पासवर्ड के साथ या उसके बिना एन्क्रिप्ट किया गया है या नहीं। क्योंकि एंड्रॉइड 5.0 डिवाइस पहले बूट पर एन्क्रिप्ट किए गए हैं, कोई पासवर्ड सेट नहीं होना चाहिए; इसलिए हम डिक्रिप्ट और माउंट/data
। - माउंट
/data
init
फिर एक tmpfs RAMDisk पर/data
को आरोहित करता है पैरामीटर का उपयोग करके इसेro.crypto.tmpfs_options
init.rc
सेट है। - रूपरेखा प्रारंभ करें
vold
vold.decrypt
कोtrigger_restart_framework
पर सेट करता है, जो सामान्य बूट प्रक्रिया को जारी रखता है।
किसी मौजूदा डिवाइस को एन्क्रिप्ट करें
ऐसा तब होता है जब आप किसी अनएन्क्रिप्टेड Android K या पहले वाले डिवाइस को एन्क्रिप्ट करते हैं जिसे L में माइग्रेट कर दिया गया है।
यह प्रक्रिया उपयोगकर्ता द्वारा शुरू की गई है और इसे कोड में "इनस्थल एन्क्रिप्शन" कहा जाता है। जब कोई उपयोगकर्ता किसी डिवाइस को एन्क्रिप्ट करने का चयन करता है, तो UI सुनिश्चित करता है कि बैटरी पूरी तरह से चार्ज हो गई है और एसी एडॉप्टर प्लग इन है, इसलिए एन्क्रिप्शन प्रक्रिया को पूरा करने के लिए पर्याप्त शक्ति है।
चेतावनी: यदि डिवाइस का पावर समाप्त हो जाता है और एन्क्रिप्ट करना समाप्त होने से पहले ही बंद हो जाता है, तो फ़ाइल डेटा को आंशिक रूप से एन्क्रिप्टेड अवस्था में छोड़ दिया जाता है। डिवाइस फ़ैक्टरी रीसेट होना चाहिए और सभी डेटा खो गया है।
इनस्थल एन्क्रिप्शन को सक्षम करने के लिए, वास्तविक ब्लॉक डिवाइस के प्रत्येक सेक्टर को पढ़ने के लिए vold
एक लूप शुरू करता है और फिर इसे क्रिप्टो ब्लॉक डिवाइस पर लिखता है। vold
यह देखने के लिए जाँच करता है कि क्या कोई सेक्टर पढ़ने और लिखने से पहले उपयोग में है, जो एक नए डिवाइस पर एन्क्रिप्शन को बहुत तेज़ बनाता है जिसमें बहुत कम या कोई डेटा नहीं है।
डिवाइस की स्थिति : ro.crypto.state = "unencrypted"
सेट करें और बूटिंग जारी रखने के लिए on nonencrypted
init
ट्रिगर को निष्पादित करें।
- पासवर्ड जांचें
यूआई कॉल
vold
कमांडcryptfs enablecrypto inplace
के साथ करता है जहांpasswd
उपयोगकर्ता का लॉक स्क्रीन पासवर्ड है। - ढांचे को उतारो
vold
त्रुटियों के लिए जाँच करता है, रिटर्न -1 अगर यह एन्क्रिप्ट नहीं कर सकता है, और लॉग में एक कारण प्रिंट करता है। यदि यह एन्क्रिप्ट कर सकता है, तो यहvold.decrypt
trigger_shutdown_framework
सेट करता है। यहinit.rc
कोlate_start
औरmain
कक्षाओं में सेवाओं को रोकने का कारण बनता है। - एक क्रिप्टो पाद बनाएँ
- ब्रेडक्रंब फ़ाइल बनाएँ
- रीबूट
- ब्रेडक्रंब फ़ाइल का पता लगाएं
- एन्क्रिप्ट
/data
प्रारंभ करेंvold
तब क्रिप्टो मैपिंग सेट करता है, जो एक वर्चुअल क्रिप्टो ब्लॉक डिवाइस बनाता है जो वास्तविक ब्लॉक डिवाइस पर मैप करता है लेकिन प्रत्येक सेक्टर को लिखे जाने पर एन्क्रिप्ट करता है, और प्रत्येक सेक्टर को पढ़ने के बाद डिक्रिप्ट करता है।vold
तब क्रिप्टो मेटाडेटा बनाता और लिखता है। - जबकि यह एन्क्रिप्ट हो रहा है, tmpfs माउंट करें
vold
एक tmpfs/data
(ro.crypto.tmpfs_options
से tmpfs विकल्पों का उपयोग करके) को आरोहित करता है और गुणvold.encrypt_progress
को 0 पर सेट करता है।vold
एक एन्क्रिप्टेड सिस्टम को बूट करने के लिए tmpfs/data
तैयार करता है औरvold.decrypt
गुण को यहां सेट करता है:trigger_restart_min_framework
- प्रगति दिखाने के लिए रूपरेखा तैयार करें
trigger_restart_min_framework
सेवाओं कीmain
श्रेणी शुरू करने के लिएinit.rc
का कारण बनता है। जब फ्रेमवर्क देखता है किvold.encrypt_progress
0 पर सेट है, तो यह प्रोग्रेस बार UI लाता है, जो हर पांच सेकंड में उस प्रॉपर्टी को क्वेरी करता है और प्रोग्रेस बार को अपडेट करता है। एन्क्रिप्शन लूप हर बार विभाजन के दूसरे प्रतिशत को एन्क्रिप्ट करने परvold.encrypt_progress
को अपडेट करता है। - जब
/data
एन्क्रिप्ट किया जाता है, तो क्रिप्टो पाद लेख को अपडेट करेंजब
/data
सफलतापूर्वक एन्क्रिप्ट किया जाता है, तोvold
मेटाडेटा में ध्वजENCRYPTION_IN_PROGRESS
को साफ़ करता है।जब डिवाइस सफलतापूर्वक अनलॉक हो जाता है, तब पासवर्ड का उपयोग मास्टर कुंजी को एन्क्रिप्ट करने के लिए किया जाता है और क्रिप्टो फुटर अपडेट किया जाता है।
यदि रीबूट किसी कारण से विफल हो जाता है, तो
vold
गुणvold.encrypt_progress
कोerror_reboot_failed
पर सेट कर देता है और UI को एक संदेश प्रदर्शित करना चाहिए जो उपयोगकर्ता को रीबूट करने के लिए एक बटन दबाने के लिए कहता है। ऐसा कभी होने की उम्मीद नहीं है।
डिफ़ॉल्ट एन्क्रिप्शन के साथ एक एन्क्रिप्टेड डिवाइस शुरू करना
ऐसा तब होता है जब आप किसी एन्क्रिप्टेड डिवाइस को बिना पासवर्ड के बूट करते हैं। चूंकि एंड्रॉइड 5.0 डिवाइस पहले बूट पर एन्क्रिप्ट किए गए हैं, कोई सेट पासवर्ड नहीं होना चाहिए और इसलिए यह डिफ़ॉल्ट एन्क्रिप्शन स्थिति है।
- बिना पासवर्ड वाले एन्क्रिप्टेड
/data
का पता लगाएंपता लगाएं कि एंड्रॉइड डिवाइस एन्क्रिप्ट किया गया है क्योंकि
/data
को माउंट नहीं किया जा सकता है और एन्क्रिप्ट करने योग्य याencryptable
में से एकforceencrypt
सेट है।vold
vold.decrypt
कोtrigger_default_encryption
पर सेट करता है, जोdefaultcrypto
सेवा शुरू करता है।trigger_default_encryption
यह देखने के लिए एन्क्रिप्शन प्रकार की जाँच करता है कि क्या/data
पासवर्ड के साथ या उसके बिना एन्क्रिप्ट किया गया है। - डिक्रिप्ट / डेटा
ब्लॉक डिवाइस पर
dm-crypt
डिवाइस बनाता है ताकि डिवाइस उपयोग के लिए तैयार हो। - माउंट / डेटा
vold
तब डिक्रिप्ट किए गए वास्तविक/data
विभाजन को आरोहित करता है और फिर नया विभाजन तैयार करता है। यह संपत्तिvold.post_fs_data_done
को 0 पर सेट करता है और फिरvold.decrypt
कोtrigger_post_fs_data
fs_data पर सेट करता है। यहinit.rc
को इसकेpost-fs-data
कमांड चलाने का कारण बनता है। वे कोई आवश्यक निर्देशिका या लिंक बनाएंगे और फिरvold.post_fs_data_done
को 1 पर सेट करेंगे।एक बार जब
vold.decrypt
vold
सेट करता है:trigger_restart_framework.
यहinit.rc
को फिर से क्लासmain
में सेवाएं शुरू करने का कारण बनता है और बूट के बाद पहली बार क्लासlate_start
में भी सेवाएं शुरू करता है। - रूपरेखा प्रारंभ करें
अब फ्रेमवर्क डिक्रिप्टेड
/data
का उपयोग करके अपनी सभी सेवाओं को बूट करता है, और सिस्टम उपयोग के लिए तैयार है।
डिफ़ॉल्ट एन्क्रिप्शन के बिना एक एन्क्रिप्टेड डिवाइस प्रारंभ करना
ऐसा तब होता है जब आप एक एन्क्रिप्टेड डिवाइस को बूट करते हैं जिसमें एक सेट पासवर्ड होता है। डिवाइस का पासवर्ड पिन, पैटर्न या पासवर्ड हो सकता है।
- पासवर्ड के साथ एन्क्रिप्टेड डिवाइस का पता लगाएं
पता लगाएं कि एंड्रॉइड डिवाइस एन्क्रिप्ट किया गया है क्योंकि ध्वज
ro.crypto.state = "encrypted"
vold
vold.decrypt
कोtrigger_restart_min_framework
पर सेट करता है क्योंकि/data
पासवर्ड से एन्क्रिप्ट किया गया है। - टीएमपीएफ माउंट करें
init.rc
से पारित पैरामीटर के साथ/data
के लिए दिए गए प्रारंभिक माउंट विकल्पों को बचाने के लिएinit
पांच गुण सेट करता है।vold
क्रिप्टो मैपिंग सेट अप करने के लिए इन गुणों का उपयोग करता है:-
ro.crypto.fs_type
-
ro.crypto.fs_real_blkdev
-
ro.crypto.fs_mnt_point
-
ro.crypto.fs_options
-
ro.crypto.fs_flags
(ASCII 8-अंकीय हेक्स संख्या 0x से पहले)
-
- पासवर्ड के लिए प्रांप्ट करने के लिए फ्रेमवर्क शुरू करें
ढांचा शुरू होता है और देखता है कि
vold.decrypt
कोtrigger_restart_min_framework
पर सेट किया गया है। यह फ्रेमवर्क को बताता है कि यह tmpfs/data
डिस्क पर बूट हो रहा है और इसे यूजर पासवर्ड प्राप्त करने की आवश्यकता है।हालाँकि, सबसे पहले, यह सुनिश्चित करने की आवश्यकता है कि डिस्क ठीक से एन्क्रिप्ट की गई थी। यह कमांड
cryptfs cryptocomplete
कोvold
पर भेजता है। यदि एन्क्रिप्शन सफलतापूर्वक पूरा हो गया है तोvold
0 लौटाता है, -1 आंतरिक त्रुटि पर, या -2 यदि एन्क्रिप्शन सफलतापूर्वक पूरा नहीं हुआ है।vold
CRYPTO_ENCRYPTION_IN_PROGRESS
ध्वज के क्रिप्टो मेटाडेटा को देखकर इसे निर्धारित करता है। यदि यह सेट है, तो एन्क्रिप्शन प्रक्रिया बाधित हो गई थी, और डिवाइस पर उपयोग करने योग्य कोई डेटा नहीं है। यदिvold
कोई त्रुटि देता है, तो UI को उपयोगकर्ता को डिवाइस को रीबूट और फ़ैक्टरी रीसेट करने के लिए एक संदेश प्रदर्शित करना चाहिए, और उपयोगकर्ता को ऐसा करने के लिए प्रेस करने के लिए एक बटन देना चाहिए। - पासवर्ड के साथ डेटा डिक्रिप्ट करें
एक बार
cryptfs cryptocomplete
सफल होने के बाद, फ्रेमवर्क एक यूआई प्रदर्शित करता है जो डिस्क पासवर्ड मांगता है। UI कमांडcryptfs checkpw
कोvold
पर भेजकर पासवर्ड की जांच करता है। यदि पासवर्ड सही है (जो एक अस्थायी स्थान पर डिक्रिप्टेड/data
को सफलतापूर्वक आरोहित करके निर्धारित किया जाता है, फिर इसे अनमाउंट कर दिया जाता है),vold
संपत्तिro.crypto.fs_crypto_blkdev
में डिक्रिप्टेड ब्लॉक डिवाइस का नाम सहेजता है और यूआई को स्थिति 0 देता है . यदि पासवर्ड गलत है, तो यह यूआई को -1 लौटाता है। - ढांचा बंद करो
UI एक क्रिप्टो बूट ग्राफ़िक डालता है और फिर कमांड
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
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
फाइल सिस्टम का उपयोग कर अपनी सभी सेवाओं को बूट करता है, और सिस्टम उपयोग के लिए तैयार है।
असफलता
एक उपकरण जो डिक्रिप्ट करने में विफल रहता है, कुछ कारणों से खराब हो सकता है। डिवाइस बूट करने के चरणों की सामान्य श्रृंखला से शुरू होता है:
- पासवर्ड के साथ एन्क्रिप्टेड डिवाइस का पता लगाएं
- टीएमपीएफ माउंट करें
- पासवर्ड के लिए प्रांप्ट करने के लिए फ्रेमवर्क शुरू करें
लेकिन फ्रेमवर्क खुलने के बाद, डिवाइस में कुछ त्रुटियां आ सकती हैं:
- पासवर्ड मेल खाता है लेकिन डेटा डिक्रिप्ट नहीं कर सकता
- उपयोगकर्ता 30 बार गलत पासवर्ड दर्ज करता है
यदि इन त्रुटियों का समाधान नहीं होता है, तो उपयोगकर्ता को फ़ैक्टरी वाइप करने के लिए संकेत दें :
यदि vold
एन्क्रिप्शन प्रक्रिया के दौरान एक त्रुटि का पता लगाता है, और यदि अभी तक कोई डेटा नष्ट नहीं हुआ है और ढांचा तैयार है, तो vold
गुण vold.encrypt_progress
को error_not_encrypted
पर सेट करता है। यूआई उपयोगकर्ता को रिबूट करने के लिए संकेत देता है और उन्हें सचेत करता है कि एन्क्रिप्शन प्रक्रिया कभी शुरू नहीं हुई। यदि फ्रेमवर्क को तोड़े जाने के बाद एरर आता है, लेकिन प्रोग्रेस बार UI के ऊपर होने से पहले, vold
सिस्टम को रीबूट करेगा। यदि रिबूट विफल हो जाता है, तो यह vold.encrypt_progress
को error_shutting_down
पर सेट करता है और -1 लौटाता है; लेकिन त्रुटि पकड़ने के लिए कुछ भी नहीं होगा। ऐसा होने की उम्मीद नहीं है।
यदि vold
एन्क्रिप्शन प्रक्रिया के दौरान किसी त्रुटि का पता लगाता है, तो यह vold.encrypt_progress
को error_partially_encrypted
पर सेट करता है और -1 लौटाता है। यूआई को तब एक संदेश प्रदर्शित करना चाहिए जिसमें कहा गया है कि एन्क्रिप्शन विफल हो गया है और उपयोगकर्ता को डिवाइस को फ़ैक्टरी रीसेट करने के लिए एक बटन प्रदान करता है।
एन्क्रिप्टेड कुंजी संग्रहीत करना
एन्क्रिप्ट की गई कुंजी को क्रिप्टो मेटाडेटा में संग्रहित किया जाता है। विश्वसनीय निष्पादन पर्यावरण (टीईई) हस्ताक्षर क्षमता का उपयोग करके हार्डवेयर बैकिंग कार्यान्वित की जाती है। पहले, हमने मास्टर कुंजी को उपयोगकर्ता के पासवर्ड और संग्रहीत नमक पर स्क्रीप्ट लागू करके उत्पन्न कुंजी के साथ एन्क्रिप्ट किया था। ऑफ-बॉक्स हमलों के खिलाफ कुंजी को लचीला बनाने के लिए, हम परिणामी कुंजी को संग्रहीत टीईई कुंजी के साथ हस्ताक्षर करके इस एल्गोरिथ्म का विस्तार करते हैं। परिणामी हस्ताक्षर को स्क्रीप्ट के एक और अनुप्रयोग द्वारा उचित लंबाई की कुंजी में बदल दिया जाता है। इस कुंजी का उपयोग तब मास्टर कुंजी को एन्क्रिप्ट और डिक्रिप्ट करने के लिए किया जाता है। इस कुंजी को स्टोर करने के लिए:
- यादृच्छिक 16-बाइट डिस्क एन्क्रिप्शन कुंजी (डीईके) और 16-बाइट नमक उत्पन्न करें।
- 32-बाइट मध्यवर्ती कुंजी 1 (IK1) का उत्पादन करने के लिए उपयोगकर्ता पासवर्ड और नमक पर स्क्रीप्ट लागू करें।
- पैड IK1 शून्य बाइट्स के साथ हार्डवेयर-बाउंड प्राइवेट कुंजी (HBK) के आकार का। विशेष रूप से, हम इस प्रकार पैड करते हैं: 00 || आईके1 || 00..00; एक शून्य बाइट, 32 IK1 बाइट्स, 223 शून्य बाइट्स।
- 256-बाइट IK2 का उत्पादन करने के लिए HBK के साथ पैडेड IK1 साइन करें।
- 32-बाइट IK3 का उत्पादन करने के लिए IK2 और नमक (चरण 2 के समान नमक) पर स्क्रीप्ट लागू करें।
- IK3 के पहले 16 बाइट्स KEK के रूप में और अंतिम 16 बाइट्स IV के रूप में उपयोग करें।
- कुंजी KEK और इनिशियलाइज़ेशन वेक्टर IV के साथ AES_CBC के साथ DEK को एन्क्रिप्ट करें।
पासवर्ड बदलना
जब कोई उपयोगकर्ता सेटिंग्स में अपना पासवर्ड बदलने या हटाने का चुनाव करता है, तो यूआई कमांड cryptfs changepw
vold
vold
में भेजता है, और नए पासवर्ड के साथ डिस्क मास्टर कुंजी को फिर से एन्क्रिप्ट करता है।
एन्क्रिप्शन गुण
init
और vold
गुण सेट करके एक दूसरे के साथ संवाद करते हैं। यहां एन्क्रिप्शन के लिए उपलब्ध संपत्तियों की सूची दी गई है।
वोल्ड गुण
संपत्ति | विवरण |
---|---|
vold.decrypt trigger_encryption | ड्राइव को बिना पासवर्ड के एन्क्रिप्ट करें। |
vold.decrypt trigger_default_encryption | यह देखने के लिए ड्राइव की जाँच करें कि क्या यह बिना पासवर्ड के एन्क्रिप्ट किया गया है। यदि यह है, डिक्रिप्ट करें और इसे माउंट करें, अन्यथा vold.decrypt को ट्रिगर_रीस्टार्ट_मिन_फ्रेमवर्क पर सेट करें। |
vold.decrypt trigger_reset_main | डिस्क पासवर्ड मांगने वाले यूआई को बंद करने के लिए वॉल्ड द्वारा सेट करें। |
vold.decrypt trigger_post_fs_data | आवश्यक निर्देशिकाओं के साथ /data तैयार करने के लिए वॉल्ड द्वारा सेट करें, और अन्य। |
vold.decrypt trigger_restart_framework | वास्तविक ढांचे और सभी सेवाओं को शुरू करने के लिए वोल्ट द्वारा सेट करें। |
vold.decrypt trigger_shutdown_framework | एन्क्रिप्शन शुरू करने के लिए पूरे ढांचे को बंद करने के लिए वोल्ड द्वारा सेट करें। |
vold.decrypt trigger_restart_min_framework | ro.crypto.state के मान के आधार पर एन्क्रिप्शन या पासवर्ड के लिए प्रॉम्प्ट के लिए प्रोग्रेस बार UI शुरू करने के लिए vold द्वारा सेट करें। |
vold.encrypt_progress | जब फ्रेमवर्क शुरू होता है, यदि यह गुण सेट है, तो प्रगति बार UI मोड में प्रवेश करें। |
vold.encrypt_progress 0 to 100 | प्रगति बार UI को प्रतिशत मान सेट प्रदर्शित करना चाहिए। |
vold.encrypt_progress error_partially_encrypted | प्रगति बार UI को एक संदेश प्रदर्शित करना चाहिए कि एन्क्रिप्शन विफल हो गया है, और उपयोगकर्ता को डिवाइस को फ़ैक्टरी रीसेट करने का विकल्प देना चाहिए। |
vold.encrypt_progress error_reboot_failed | प्रोग्रेस बार UI को एन्क्रिप्शन पूरा होने वाला संदेश प्रदर्शित करना चाहिए, और उपयोगकर्ता को डिवाइस को रीबूट करने के लिए एक बटन देना चाहिए। यह त्रुटि होने की उम्मीद नहीं है। |
vold.encrypt_progress error_not_encrypted | प्रगति बार UI को एक संदेश प्रदर्शित करना चाहिए कि एक त्रुटि हुई, कोई डेटा एन्क्रिप्ट या गुम नहीं हुआ, और उपयोगकर्ता को सिस्टम को रीबूट करने के लिए एक बटन देना चाहिए। |
vold.encrypt_progress error_shutting_down | प्रोग्रेस बार UI नहीं चल रहा है, इसलिए यह स्पष्ट नहीं है कि इस त्रुटि का जवाब कौन देगा। और वैसे भी ऐसा कभी नहीं होना चाहिए। |
vold.post_fs_data_done 0 | vold.decrypt को trigger_post_fs_data पर सेट करने से ठीक पहले vold द्वारा सेट करें। |
vold.post_fs_data_done 1 | कार्य post-fs-data को समाप्त करने के तुरंत बाद init.rc या init.rc द्वारा सेट करें। |
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 | tmpfs /data फ़ाइल सिस्टम को आरोहित करते समय init द्वारा उपयोग किए जाने वाले विकल्पों के साथ init.rc द्वारा सेट करें। |
इनिट क्रियाएं
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