फुल-डिस्क एन्क्रिप्शन एक एन्क्रिप्टेड कुंजी का उपयोग करके एंड्रॉइड डिवाइस पर सभी उपयोगकर्ता डेटा को एन्कोड करने की प्रक्रिया है। एक बार जब कोई डिवाइस एन्क्रिप्ट हो जाता है, तो उपयोगकर्ता द्वारा बनाए गए सभी डेटा को डिस्क पर भेजने से पहले स्वचालित रूप से एन्क्रिप्ट किया जाता है और कॉलिंग प्रक्रिया में वापस करने से पहले सभी डेटा को स्वचालित रूप से डिक्रिप्ट किया जाता है।
फुल-डिस्क एन्क्रिप्शन को एंड्रॉइड में 4.4 में पेश किया गया था, लेकिन एंड्रॉइड 5.0 ने इन नई सुविधाओं को पेश किया:
- तेज़ एन्क्रिप्शन बनाया गया, जो पहले बूट में अधिक समय लगने से बचने के लिए केवल डेटा विभाजन पर उपयोग किए गए ब्लॉक को एन्क्रिप्ट करता है। वर्तमान में केवल ext4 और f2fs फ़ाइल सिस्टम ही तेज़ एन्क्रिप्शन का समर्थन करते हैं।
- पहले बूट पर एन्क्रिप्ट करने के लिए
forceencrypt
fstab ध्वज जोड़ा गया। - पासवर्ड के बिना पैटर्न और एन्क्रिप्शन के लिए समर्थन जोड़ा गया।
- विश्वसनीय निष्पादन पर्यावरण (टीईई) हस्ताक्षर क्षमता (जैसे कि ट्रस्टज़ोन में) का उपयोग करके एन्क्रिप्शन कुंजी का हार्डवेयर-समर्थित भंडारण जोड़ा गया। अधिक विवरण के लिए एन्क्रिप्टेड कुंजी संग्रहीत करना देखें।
सावधानी: एंड्रॉइड 5.0 में अपग्रेड किए गए और फिर एन्क्रिप्ट किए गए डिवाइस को फ़ैक्टरी डेटा रीसेट द्वारा अनएन्क्रिप्टेड स्थिति में वापस किया जा सकता है। पहले बूट पर एन्क्रिप्ट किए गए नए एंड्रॉइड 5.0 डिवाइस को अनएन्क्रिप्टेड स्थिति में वापस नहीं किया जा सकता है।
एंड्रॉइड फुल-डिस्क एन्क्रिप्शन कैसे काम करता है
एंड्रॉइड फुल-डिस्क एन्क्रिप्शन dm-crypt
पर आधारित है, जो एक कर्नेल फीचर है जो ब्लॉक डिवाइस लेयर पर काम करता है। इस वजह से, एन्क्रिप्शन एंबेडेड मल्टीमीडिया कार्ड ( ईएमएमसी) और इसी तरह के फ्लैश डिवाइस के साथ काम करता है जो खुद को कर्नेल में ब्लॉक डिवाइस के रूप में प्रस्तुत करते हैं। YAFFS के साथ एन्क्रिप्शन संभव नहीं है, जो सीधे कच्चे NAND फ़्लैश चिप से बात करता है।
एन्क्रिप्शन एल्गोरिदम सिफर-ब्लॉक चेनिंग (CBC) और ESSIV:SHA256 के साथ 128 उन्नत एन्क्रिप्शन स्टैंडर्ड (AES) है। ओपनएसएसएल लाइब्रेरी में कॉल के माध्यम से मास्टर कुंजी को 128-बिट एईएस के साथ एन्क्रिप्ट किया गया है। आपको कुंजी के लिए 128 बिट्स या अधिक का उपयोग करना होगा (256 वैकल्पिक होने के साथ)।
नोट: ओईएम मास्टर कुंजी को एन्क्रिप्ट करने के लिए 128-बिट या उच्चतर का उपयोग कर सकते हैं।
Android 5.0 रिलीज़ में, चार प्रकार की एन्क्रिप्शन स्थितियाँ हैं:
- गलती करना
- नत्थी करना
- पासवर्ड
- नमूना
पहले बूट पर, डिवाइस एक यादृच्छिक रूप से उत्पन्न 128-बिट मास्टर कुंजी बनाता है और फिर इसे एक डिफ़ॉल्ट पासवर्ड और संग्रहीत नमक के साथ हैश करता है। डिफ़ॉल्ट पासवर्ड है: "डिफ़ॉल्ट_पासवर्ड" हालांकि, परिणामी हैश को टीईई (जैसे ट्रस्टज़ोन) के माध्यम से भी हस्ताक्षरित किया जाता है, जो मास्टर कुंजी को एन्क्रिप्ट करने के लिए हस्ताक्षर के हैश का उपयोग करता है।
आप एंड्रॉइड ओपन सोर्स प्रोजेक्ट 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
पर एक अस्थायी फ़ाइल सिस्टम लगाया गया है। यह एंड्रॉइड को पासवर्ड के लिए संकेत देने, प्रगति दिखाने या आवश्यकतानुसार डेटा वाइप का सुझाव देने की अनुमति देता है। यह यह सीमा लगाता है कि अस्थायी फ़ाइल सिस्टम से वास्तविक /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
के साथ एक नए डिवाइस को एन्क्रिप्ट करें: पहले बूट पर अनिवार्य एन्क्रिप्शन (एंड्रॉइड एल में शुरू)। - किसी मौजूदा डिवाइस को एन्क्रिप्ट करें: उपयोगकर्ता द्वारा शुरू किया गया एन्क्रिप्शन (एंड्रॉइड K और पहले वाला)।
-
- एक एन्क्रिप्टेड डिवाइस को बूट करें:
- बिना पासवर्ड के एक एन्क्रिप्टेड डिवाइस शुरू करना: एक एन्क्रिप्टेड डिवाइस को बूट करना जिसमें कोई सेट पासवर्ड नहीं है (एंड्रॉइड 5.0 और बाद के संस्करण चलाने वाले उपकरणों के लिए प्रासंगिक)।
- एक एन्क्रिप्टेड डिवाइस को पासवर्ड के साथ शुरू करना: एक एन्क्रिप्टेड डिवाइस को बूट करना जिसमें एक सेट पासवर्ड है।
इन प्रवाहों के अलावा, डिवाइस /data
एन्क्रिप्ट करने में भी विफल हो सकता है। प्रत्येक प्रवाह को नीचे विस्तार से समझाया गया है।
Forceencrypt के साथ एक नया डिवाइस एन्क्रिप्ट करें
यह एंड्रॉइड 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
सेवा शुरू करता है। (यह डिफ़ॉल्ट एन्क्रिप्टेड उपयोगकर्ताडेटा को माउंट करने के लिए नीचे प्रवाह शुरू करता है।)trigger_default_encryption
यह देखने के लिए एन्क्रिप्शन प्रकार की जांच करता है कि/data
पासवर्ड के साथ एन्क्रिप्ट किया गया है या उसके बिना। चूँकि Android 5.0 डिवाइस पहले बूट पर एन्क्रिप्टेड होते हैं, इसलिए कोई पासवर्ड सेट नहीं होना चाहिए; इसलिए हम/data
डिक्रिप्ट और माउंट करते हैं। - माउंट
/data
इसके बाद
init
ro.crypto.tmpfs_options
से उठाए गए मापदंडों का उपयोग करके tmpfs RAMDisk पर/data
माउंट करता है, जो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
एक tmpfs/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
पर सेट करता है और यूआई को एक संदेश प्रदर्शित करना चाहिए जो उपयोगकर्ता को रीबूट करने के लिए एक बटन दबाने के लिए कहता है। ऐसा कभी होने की उम्मीद नहीं है.
एक एन्क्रिप्टेड डिवाइस को डिफ़ॉल्ट एन्क्रिप्शन के साथ प्रारंभ करना
ऐसा तब होता है जब आप किसी एन्क्रिप्टेड डिवाइस को बिना पासवर्ड के बूट करते हैं। चूँकि एंड्रॉइड 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
पर सेट करता है। इसके कारणinit.rc
को अपनेpost-fs-data
कमांड चलाने का कारण बनता है। वे कोई आवश्यक निर्देशिका या लिंक बनाएंगे और फिरvold.post_fs_data_done
को 1 पर सेट करेंगे।एक बार जब
vold
उस प्रॉपर्टी में 1 देखता है, तो यह प्रॉपर्टीvold.decrypt
कोtrigger_restart_framework.
इसके कारणinit.rc
क्लासmain
में फिर से सेवाएँ शुरू करता है और बूट के बाद पहली बार क्लासlate_start
में भी सेवाएँ शुरू करता है। - ढांचा प्रारंभ करें
अब फ्रेमवर्क डिक्रिप्टेड
/data
उपयोग करके अपनी सभी सेवाओं को बूट करता है, और सिस्टम उपयोग के लिए तैयार है।
डिफ़ॉल्ट एन्क्रिप्शन के बिना एन्क्रिप्टेड डिवाइस प्रारंभ करना
ऐसा तब होता है जब आप एक एन्क्रिप्टेड डिवाइस को बूट करते हैं जिसमें एक सेट पासवर्ड होता है। डिवाइस का पासवर्ड पिन, पैटर्न या पासवर्ड हो सकता है।
- पासवर्ड से एन्क्रिप्टेड डिवाइस का पता लगाएं
पता लगाएं कि एंड्रॉइड डिवाइस एन्क्रिप्टेड है क्योंकि ध्वज
ro.crypto.state = "encrypted"
vold
vold.decrypt
trigger_restart_min_framework
पर सेट करता है क्योंकि/data
पासवर्ड से एन्क्रिप्ट किया गया है। - माउंट tmpfs
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
कोई त्रुटि देता है, तो यूआई को उपयोगकर्ता को डिवाइस को रीबूट और फ़ैक्टरी रीसेट करने के लिए एक संदेश प्रदर्शित करना चाहिए, और उपयोगकर्ता को ऐसा करने के लिए दबाने के लिए एक बटन देना चाहिए। - पासवर्ड से डेटा डिक्रिप्ट करें
एक बार
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 लौटाता है। यूआई को तब एक संदेश प्रदर्शित करना चाहिए जिसमें कहा गया हो कि एन्क्रिप्शन विफल हो गया है और उपयोगकर्ता को डिवाइस को फ़ैक्टरी रीसेट करने के लिए एक बटन प्रदान करना चाहिए।
एन्क्रिप्टेड कुंजी संग्रहीत करना
एन्क्रिप्टेड कुंजी क्रिप्टो मेटाडेटा में संग्रहीत होती है। हार्डवेयर बैकिंग को विश्वसनीय निष्पादन पर्यावरण (टीईई) की हस्ताक्षर क्षमता का उपयोग करके कार्यान्वित किया जाता है। पहले, हम उपयोगकर्ता के पासवर्ड और संग्रहीत नमक पर स्क्रिप लागू करके उत्पन्न कुंजी के साथ मास्टर कुंजी को एन्क्रिप्ट करते थे। ऑफ-बॉक्स हमलों के खिलाफ कुंजी को लचीला बनाने के लिए, हम संग्रहीत टीईई कुंजी के साथ परिणामी कुंजी पर हस्ताक्षर करके इस एल्गोरिदम का विस्तार करते हैं। परिणामी हस्ताक्षर को स्क्रिप्ट के एक और अनुप्रयोग द्वारा उचित लंबाई की कुंजी में बदल दिया जाता है। इस कुंजी का उपयोग मास्टर कुंजी को एन्क्रिप्ट और डिक्रिप्ट करने के लिए किया जाता है। इस कुंजी को संग्रहीत करने के लिए:
- यादृच्छिक 16-बाइट डिस्क एन्क्रिप्शन कुंजी (DEK) और 16-बाइट नमक उत्पन्न करें।
- 32-बाइट मध्यवर्ती कुंजी 1 (IK1) उत्पन्न करने के लिए उपयोगकर्ता पासवर्ड और नमक पर स्क्रिप्ट लागू करें।
- हार्डवेयर-बाउंड प्राइवेट कुंजी (HBK) के आकार के शून्य बाइट्स के साथ पैड IK1। विशेष रूप से, हम इस प्रकार पैड करते हैं: 00 || IK1 || 00..00; एक शून्य बाइट, 32 IK1 बाइट्स, 223 शून्य बाइट्स।
- 256-बाइट IK2 का उत्पादन करने के लिए HBK के साथ गद्देदार IK1 पर हस्ताक्षर करें।
- 32-बाइट IK3 का उत्पादन करने के लिए IK2 और नमक (चरण 2 के समान नमक) पर स्क्रिप्ट लागू करें।
- IK3 के पहले 16 बाइट्स को KEK के रूप में और अंतिम 16 बाइट्स को IV के रूप में उपयोग करें।
- DEK को AES_CBC, कुंजी KEK और इनिशियलाइज़ेशन वेक्टर IV के साथ एन्क्रिप्ट करें।
पासवर्ड बदलना
जब कोई उपयोगकर्ता सेटिंग्स में अपना पासवर्ड बदलने या हटाने का चुनाव करता है, तो यूआई कमांड cryptfs changepw
को vold
पर भेजता है, और vold
नए पासवर्ड के साथ डिस्क मास्टर कुंजी को फिर से एन्क्रिप्ट करता है।
एन्क्रिप्शन गुण
vold
और init
गुण सेट करके एक दूसरे के साथ संवाद करते हैं। यहां एन्क्रिप्शन के लिए उपलब्ध संपत्तियों की एक सूची दी गई है।
वॉल्ड गुण
संपत्ति | विवरण |
---|---|
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 के मान के आधार पर, एन्क्रिप्शन के लिए प्रगति बार यूआई या पासवर्ड के लिए प्रॉम्प्ट शुरू करने के लिए वॉल्ड द्वारा सेट करें। |
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 | 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 | init.rc द्वारा उन विकल्पों के साथ सेट करें जिनका उपयोग init को tmpfs /data फ़ाइल सिस्टम को माउंट करते समय करना चाहिए। |
आरंभिक क्रियाएँ
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,
फुल-डिस्क एन्क्रिप्शन एक एन्क्रिप्टेड कुंजी का उपयोग करके एंड्रॉइड डिवाइस पर सभी उपयोगकर्ता डेटा को एन्कोड करने की प्रक्रिया है। एक बार जब कोई डिवाइस एन्क्रिप्ट हो जाता है, तो उपयोगकर्ता द्वारा बनाए गए सभी डेटा को डिस्क पर भेजने से पहले स्वचालित रूप से एन्क्रिप्ट किया जाता है और कॉलिंग प्रक्रिया में वापस करने से पहले सभी डेटा को स्वचालित रूप से डिक्रिप्ट किया जाता है।
फुल-डिस्क एन्क्रिप्शन को एंड्रॉइड में 4.4 में पेश किया गया था, लेकिन एंड्रॉइड 5.0 ने इन नई सुविधाओं को पेश किया:
- तेज़ एन्क्रिप्शन बनाया गया, जो पहले बूट में अधिक समय लगने से बचने के लिए केवल डेटा विभाजन पर उपयोग किए गए ब्लॉक को एन्क्रिप्ट करता है। वर्तमान में केवल ext4 और f2fs फ़ाइल सिस्टम ही तेज़ एन्क्रिप्शन का समर्थन करते हैं।
- पहले बूट पर एन्क्रिप्ट करने के लिए
forceencrypt
fstab ध्वज जोड़ा गया। - पासवर्ड के बिना पैटर्न और एन्क्रिप्शन के लिए समर्थन जोड़ा गया।
- विश्वसनीय निष्पादन पर्यावरण (टीईई) हस्ताक्षर क्षमता (जैसे कि ट्रस्टज़ोन में) का उपयोग करके एन्क्रिप्शन कुंजी का हार्डवेयर-समर्थित भंडारण जोड़ा गया। अधिक विवरण के लिए एन्क्रिप्टेड कुंजी संग्रहीत करना देखें।
सावधानी: एंड्रॉइड 5.0 में अपग्रेड किए गए और फिर एन्क्रिप्ट किए गए डिवाइस को फ़ैक्टरी डेटा रीसेट द्वारा अनएन्क्रिप्टेड स्थिति में वापस किया जा सकता है। पहले बूट पर एन्क्रिप्ट किए गए नए एंड्रॉइड 5.0 डिवाइस को अनएन्क्रिप्टेड स्थिति में वापस नहीं किया जा सकता है।
एंड्रॉइड फुल-डिस्क एन्क्रिप्शन कैसे काम करता है
एंड्रॉइड फुल-डिस्क एन्क्रिप्शन dm-crypt
पर आधारित है, जो एक कर्नेल फीचर है जो ब्लॉक डिवाइस लेयर पर काम करता है। इस वजह से, एन्क्रिप्शन एंबेडेड मल्टीमीडिया कार्ड ( ईएमएमसी) और इसी तरह के फ्लैश डिवाइस के साथ काम करता है जो खुद को कर्नेल में ब्लॉक डिवाइस के रूप में प्रस्तुत करते हैं। YAFFS के साथ एन्क्रिप्शन संभव नहीं है, जो सीधे कच्चे NAND फ़्लैश चिप से बात करता है।
एन्क्रिप्शन एल्गोरिदम सिफर-ब्लॉक चेनिंग (CBC) और ESSIV:SHA256 के साथ 128 उन्नत एन्क्रिप्शन स्टैंडर्ड (AES) है। ओपनएसएसएल लाइब्रेरी में कॉल के माध्यम से मास्टर कुंजी को 128-बिट एईएस के साथ एन्क्रिप्ट किया गया है। आपको कुंजी के लिए 128 बिट्स या अधिक का उपयोग करना होगा (256 वैकल्पिक होने के साथ)।
नोट: ओईएम मास्टर कुंजी को एन्क्रिप्ट करने के लिए 128-बिट या उच्चतर का उपयोग कर सकते हैं।
Android 5.0 रिलीज़ में, चार प्रकार की एन्क्रिप्शन स्थितियाँ हैं:
- गलती करना
- नत्थी करना
- पासवर्ड
- नमूना
पहले बूट पर, डिवाइस एक यादृच्छिक रूप से उत्पन्न 128-बिट मास्टर कुंजी बनाता है और फिर इसे एक डिफ़ॉल्ट पासवर्ड और संग्रहीत नमक के साथ हैश करता है। डिफ़ॉल्ट पासवर्ड है: "डिफ़ॉल्ट_पासवर्ड" हालांकि, परिणामी हैश को टीईई (जैसे ट्रस्टज़ोन) के माध्यम से भी हस्ताक्षरित किया जाता है, जो मास्टर कुंजी को एन्क्रिप्ट करने के लिए हस्ताक्षर के हैश का उपयोग करता है।
आप एंड्रॉइड ओपन सोर्स प्रोजेक्ट 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
पर एक अस्थायी फ़ाइल सिस्टम लगाया गया है। यह एंड्रॉइड को पासवर्ड के लिए संकेत देने, प्रगति दिखाने या आवश्यकतानुसार डेटा वाइप का सुझाव देने की अनुमति देता है। यह यह सीमा लगाता है कि अस्थायी फ़ाइल सिस्टम से वास्तविक /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
के साथ एक नए डिवाइस को एन्क्रिप्ट करें: पहले बूट पर अनिवार्य एन्क्रिप्शन (एंड्रॉइड एल में शुरू)। - किसी मौजूदा डिवाइस को एन्क्रिप्ट करें: उपयोगकर्ता द्वारा शुरू किया गया एन्क्रिप्शन (एंड्रॉइड K और पहले वाला)।
-
- एक एन्क्रिप्टेड डिवाइस को बूट करें:
- बिना पासवर्ड के एक एन्क्रिप्टेड डिवाइस शुरू करना: एक एन्क्रिप्टेड डिवाइस को बूट करना जिसमें कोई सेट पासवर्ड नहीं है (एंड्रॉइड 5.0 और बाद के संस्करण चलाने वाले उपकरणों के लिए प्रासंगिक)।
- एक एन्क्रिप्टेड डिवाइस को पासवर्ड के साथ शुरू करना: एक एन्क्रिप्टेड डिवाइस को बूट करना जिसमें एक सेट पासवर्ड है।
इन प्रवाहों के अलावा, डिवाइस /data
एन्क्रिप्ट करने में भी विफल हो सकता है। प्रत्येक प्रवाह को नीचे विस्तार से समझाया गया है।
Forceencrypt के साथ एक नया डिवाइस एन्क्रिप्ट करें
यह एंड्रॉइड 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
सेवा शुरू करता है। (यह डिफ़ॉल्ट एन्क्रिप्टेड उपयोगकर्ताडेटा को माउंट करने के लिए नीचे प्रवाह शुरू करता है।)trigger_default_encryption
यह देखने के लिए एन्क्रिप्शन प्रकार की जांच करता है कि/data
पासवर्ड के साथ एन्क्रिप्ट किया गया है या उसके बिना। चूँकि Android 5.0 डिवाइस पहले बूट पर एन्क्रिप्टेड होते हैं, इसलिए कोई पासवर्ड सेट नहीं होना चाहिए; इसलिए हम/data
डिक्रिप्ट और माउंट करते हैं। - माउंट
/data
इसके बाद
init
ro.crypto.tmpfs_options
से उठाए गए मापदंडों का उपयोग करके tmpfs RAMDisk पर/data
माउंट करता है, जो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
एक tmpfs/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
पर सेट करता है और यूआई को एक संदेश प्रदर्शित करना चाहिए जो उपयोगकर्ता को रीबूट करने के लिए एक बटन दबाने के लिए कहता है। ऐसा कभी होने की उम्मीद नहीं है.
एक एन्क्रिप्टेड डिवाइस को डिफ़ॉल्ट एन्क्रिप्शन के साथ प्रारंभ करना
ऐसा तब होता है जब आप किसी एन्क्रिप्टेड डिवाइस को बिना पासवर्ड के बूट करते हैं। चूँकि एंड्रॉइड 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
पर सेट करता है। इसके कारणinit.rc
अपनेpost-fs-data
कमांड चलाने का कारण बनता है। वे कोई आवश्यक निर्देशिका या लिंक बनाएंगे और फिरvold.post_fs_data_done
को 1 पर सेट करेंगे।एक बार जब
vold
उस प्रॉपर्टी में 1 देखता है, तो यह प्रॉपर्टीvold.decrypt
कोtrigger_restart_framework.
इसके कारणinit.rc
क्लासmain
में फिर से सेवाएँ शुरू करता है और बूट के बाद पहली बार क्लासlate_start
में भी सेवाएँ शुरू करता है। - ढांचा प्रारंभ करें
अब फ्रेमवर्क डिक्रिप्टेड
/data
उपयोग करके अपनी सभी सेवाओं को बूट करता है, और सिस्टम उपयोग के लिए तैयार है।
Starting an encrypted device without default encryption
This is what happens when you boot up an encrypted device that has a set password. The device's password can be a pin, pattern, or password.
- Detect encrypted device with a password
Detect that the Android device is encrypted because the flag
ro.crypto.state = "encrypted"
vold
setsvold.decrypt
totrigger_restart_min_framework
because/data
is encrypted with a password. - Mount tmpfs
init
sets five properties to save the initial mount options given for/data
with parameters passed frominit.rc
.vold
uses these properties to set up the crypto mapping:-
ro.crypto.fs_type
-
ro.crypto.fs_real_blkdev
-
ro.crypto.fs_mnt_point
-
ro.crypto.fs_options
-
ro.crypto.fs_flags
(ASCII 8-digit hex number preceded by 0x)
-
- Start framework to prompt for password
The framework starts up and sees that
vold.decrypt
is set totrigger_restart_min_framework
. This tells the framework that it is booting on a tmpfs/data
disk and it needs to get the user password.First, however, it needs to make sure that the disk was properly encrypted. It sends the command
cryptfs cryptocomplete
tovold
.vold
returns 0 if encryption was completed successfully, -1 on internal error, or -2 if encryption was not completed successfully.vold
determines this by looking in the crypto metadata for theCRYPTO_ENCRYPTION_IN_PROGRESS
flag. If it's set, the encryption process was interrupted, and there is no usable data on the device. Ifvold
returns an error, the UI should display a message to the user to reboot and factory reset the device, and give the user a button to press to do so. - Decrypt data with password
Once
cryptfs cryptocomplete
is successful, the framework displays a UI asking for the disk password. The UI checks the password by sending the commandcryptfs checkpw
tovold
. If the password is correct (which is determined by successfully mounting the decrypted/data
at a temporary location, then unmounting it),vold
saves the name of the decrypted block device in the propertyro.crypto.fs_crypto_blkdev
and returns status 0 to the UI. If the password is incorrect, it returns -1 to the UI. - Stop framework
The UI puts up a crypto boot graphic and then calls
vold
with the commandcryptfs restart
.vold
sets the propertyvold.decrypt
totrigger_reset_main
, which causesinit.rc
to doclass_reset main
. This stops all services in the main class, which allows the tmpfs/data
to be unmounted. - Mount
/data
vold
then mounts the decrypted real/data
partition and prepares the new partition (which may never have been prepared if it was encrypted with the wipe option, which is not supported on first release). It sets the propertyvold.post_fs_data_done
to 0 and then setsvold.decrypt
totrigger_post_fs_data
. This causesinit.rc
to run itspost-fs-data
commands. They will create any necessary directories or links and then setvold.post_fs_data_done
to 1. Oncevold
sees the 1 in that property, it sets the propertyvold.decrypt
totrigger_restart_framework
. This causesinit.rc
to start services in classmain
again and also start services in classlate_start
for the first time since boot. - Start full framework
Now the framework boots all its services using the decrypted
/data
filesystem, and the system is ready for use.
Failure
A device that fails to decrypt might be awry for a few reasons. The device starts with the normal series of steps to boot:
- Detect encrypted device with a password
- Mount tmpfs
- Start framework to prompt for password
But after the framework opens, the device can encounter some errors:
- Password matches but cannot decrypt data
- User enters wrong password 30 times
If these errors are not resolved, prompt user to factory wipe :
If vold
detects an error during the encryption process, and if no data has been destroyed yet and the framework is up, vold
sets the property vold.encrypt_progress
to error_not_encrypted
. The UI prompts the user to reboot and alerts them the encryption process never started. If the error occurs after the framework has been torn down, but before the progress bar UI is up, vold
will reboot the system. If the reboot fails, it sets vold.encrypt_progress
to error_shutting_down
and returns -1; but there will not be anything to catch the error. This is not expected to happen.
If vold
detects an error during the encryption process, it sets vold.encrypt_progress
to error_partially_encrypted
and returns -1. The UI should then display a message saying the encryption failed and provide a button for the user to factory reset the device.
Storing the encrypted key
The encrypted key is stored in the crypto metadata. Hardware backing is implemented by using Trusted Execution Environment's (TEE) signing capability. Previously, we encrypted the master key with a key generated by applying scrypt to the user's password and the stored salt. In order to make the key resilient against off-box attacks, we extend this algorithm by signing the resultant key with a stored TEE key. The resultant signature is then turned into an appropriate length key by one more application of scrypt. This key is then used to encrypt and decrypt the master key. To store this key:
- Generate random 16-byte disk encryption key (DEK) and 16-byte salt.
- Apply scrypt to the user password and the salt to produce 32-byte intermediate key 1 (IK1).
- Pad IK1 with zero bytes to the size of the hardware-bound private key (HBK). Specifically, we pad as: 00 || IK1 || 00..00; one zero byte, 32 IK1 bytes, 223 zero bytes.
- Sign padded IK1 with HBK to produce 256-byte IK2.
- Apply scrypt to IK2 and salt (same salt as step 2) to produce 32-byte IK3.
- Use the first 16 bytes of IK3 as KEK and the last 16 bytes as IV.
- Encrypt DEK with AES_CBC, with key KEK, and initialization vector IV.
Changing the password
When a user elects to change or remove their password in settings, the UI sends the command cryptfs changepw
to vold
, and vold
re-encrypts the disk master key with the new password.
Encryption properties
vold
and init
communicate with each other by setting properties. Here is a list of available properties for encryption.
Vold properties
संपत्ति | विवरण |
---|---|
vold.decrypt trigger_encryption | Encrypt the drive with no password. |
vold.decrypt trigger_default_encryption | Check the drive to see if it is encrypted with no password. If it is, decrypt and mount it, else set vold.decrypt to trigger_restart_min_framework. |
vold.decrypt trigger_reset_main | Set by vold to shutdown the UI asking for the disk password. |
vold.decrypt trigger_post_fs_data | Set by vold to prep /data with necessary directories, et al. |
vold.decrypt trigger_restart_framework | Set by vold to start the real framework and all services. |
vold.decrypt trigger_shutdown_framework | Set by vold to shutdown the full framework to start encryption. |
vold.decrypt trigger_restart_min_framework | Set by vold to start the progress bar UI for encryption or prompt for password, depending on the value of ro.crypto.state . |
vold.encrypt_progress | When the framework starts up, if this property is set, enter the progress bar UI mode. |
vold.encrypt_progress 0 to 100 | The progress bar UI should display the percentage value set. |
vold.encrypt_progress error_partially_encrypted | The progress bar UI should display a message that the encryption failed, and give the user an option to factory reset the device. |
vold.encrypt_progress error_reboot_failed | The progress bar UI should display a message saying encryption completed, and give the user a button to reboot the device. This error is not expected to happen. |
vold.encrypt_progress error_not_encrypted | The progress bar UI should display a message saying an error occurred, no data was encrypted or lost, and give the user a button to reboot the system. |
vold.encrypt_progress error_shutting_down | The progress bar UI is not running, so it is unclear who will respond to this error. And it should never happen anyway. |
vold.post_fs_data_done 0 | Set by vold just before setting vold.decrypt to trigger_post_fs_data . |
vold.post_fs_data_done 1 | Set by init.rc or init.rc just after finishing the task post-fs-data . |
init properties
संपत्ति | विवरण |
---|---|
ro.crypto.fs_crypto_blkdev | Set by the vold command checkpw for later use by the vold command restart . |
ro.crypto.state unencrypted | Set by init to say this system is running with an unencrypted /data ro.crypto.state encrypted . Set by init to say this system is running with an encrypted /data . |
| These five properties are set by init when it tries to mount /data with parameters passed in from init.rc . vold uses these to setup the crypto mapping. |
ro.crypto.tmpfs_options | Set by init.rc with the options init should use when mounting the tmpfs /data filesystem. |
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