पूर्ण-डिस्क एन्क्रिप्शन एक एन्क्रिप्टेड कुंजी का उपयोग करके एंड्रॉइड डिवाइस पर सभी उपयोगकर्ता डेटा को एन्कोड करने की प्रक्रिया है। एक बार डिवाइस को एन्क्रिप्ट करने के बाद, सभी उपयोगकर्ता द्वारा बनाए गए डेटा को डिस्क पर करने से पहले स्वचालित रूप से एन्क्रिप्ट किया जाता है और कॉलिंग प्रक्रिया में वापस आने से पहले सभी डेटा को स्वचालित रूप से डिक्रिप्ट पढ़ता है।
एंड्रॉइड के लिए 4.4 में फुल-डिस्क एन्क्रिप्शन पेश किया गया था, लेकिन एंड्रॉइड 5.0 ने इन नई सुविधाओं को पेश किया:
- तेज़ एन्क्रिप्शन बनाया गया, जो केवल पहले बूट को लंबे समय तक लेने से बचने के लिए डेटा विभाजन पर उपयोग किए गए ब्लॉक को एन्क्रिप्ट करता है। वर्तमान में केवल ext4 और f2fs फाइल सिस्टम तेज एन्क्रिप्शन का समर्थन करते हैं।
- पहले बूट पर एन्क्रिप्ट करने के लिए
forceencrypt
fstab फ़्लैग जोड़ा गया। - पासवर्ड के बिना पैटर्न और एन्क्रिप्शन के लिए जोड़ा गया समर्थन।
- विश्वसनीय निष्पादन पर्यावरण (टीईई) हस्ताक्षर क्षमता (जैसे ट्रस्टज़ोन में) का उपयोग करके एन्क्रिप्शन कुंजी का हार्डवेयर-समर्थित भंडारण जोड़ा गया। अधिक विवरण के लिए एन्क्रिप्टेड कुंजी को संग्रहीत करना देखें।
सावधानी: Android 5.0 में अपग्रेड किए गए और फिर एन्क्रिप्ट किए गए डिवाइस फ़ैक्टरी डेटा रीसेट द्वारा अनएन्क्रिप्टेड स्थिति में वापस आ सकते हैं। पहले बूट पर एन्क्रिप्ट किए गए नए Android 5.0 डिवाइस को अनएन्क्रिप्टेड स्थिति में वापस नहीं किया जा सकता है।
Android पूर्ण-डिस्क एन्क्रिप्शन कैसे काम करता है
एंड्रॉइड फुल-डिस्क एन्क्रिप्शन dm-crypt
पर आधारित है, जो एक कर्नेल फीचर है जो ब्लॉक डिवाइस लेयर पर काम करता है। इस वजह से, एन्क्रिप्शन एंबेडेड मल्टीमीडिया कार्ड ( eMMC) और इसी तरह के फ्लैश डिवाइस के साथ काम करता है जो खुद को कर्नेल में ब्लॉक डिवाइस के रूप में पेश करते हैं। YAFFS के साथ एन्क्रिप्शन संभव नहीं है, जो सीधे कच्चे NAND फ्लैश चिप से बात करता है।
एन्क्रिप्शन एल्गोरिथम 128 उन्नत एन्क्रिप्शन स्टैंडर्ड (एईएस) है जिसमें सिफर-ब्लॉक चेनिंग (सीबीसी) और ईएसएसआईवी: एसएचए256 शामिल हैं। मास्टर कुंजी को ओपनएसएसएल लाइब्रेरी में कॉल के माध्यम से 128-बिट एईएस के साथ एन्क्रिप्ट किया गया है। आपको कुंजी के लिए 128 बिट या अधिक का उपयोग करना चाहिए (256 वैकल्पिक होने के साथ)।
नोट: ओईएम मास्टर कुंजी को एन्क्रिप्ट करने के लिए 128-बिट या उच्चतर का उपयोग कर सकते हैं।
Android 5.0 रिलीज़ में, चार प्रकार की एन्क्रिप्शन स्थितियाँ हैं:
- चूक जाना
- पिन
- पासवर्ड
- प्रतिरूप
पहले बूट पर, डिवाइस बेतरतीब ढंग से उत्पन्न 128-बिट मास्टर कुंजी बनाता है और फिर इसे एक डिफ़ॉल्ट पासवर्ड और संग्रहीत नमक के साथ हैश करता है। डिफ़ॉल्ट पासवर्ड है: "डिफ़ॉल्ट_पासवर्ड" हालांकि, परिणामी हैश को एक टीईई (जैसे ट्रस्टज़ोन) के माध्यम से भी हस्ताक्षरित किया जाता है, जो मास्टर कुंजी को एन्क्रिप्ट करने के लिए हस्ताक्षर के हैश का उपयोग करता है।
आप Android ओपन सोर्स प्रोजेक्ट cryptfs.cpp फ़ाइल में परिभाषित डिफ़ॉल्ट पासवर्ड पा सकते हैं।
जब उपयोगकर्ता डिवाइस पर पिन/पास या पासवर्ड सेट करता है, तो केवल 128-बिट कुंजी को फिर से एन्क्रिप्ट और संग्रहीत किया जाता है। (अर्थात उपयोगकर्ता पिन/पास/पैटर्न परिवर्तन उपयोगकर्ता डेटा के पुन: एन्क्रिप्शन का कारण नहीं बनते हैं।) ध्यान दें कि प्रबंधित डिवाइस पिन, पैटर्न या पासवर्ड प्रतिबंधों के अधीन हो सकता है।
एन्क्रिप्शन का प्रबंधन init
और vold
द्वारा किया जाता है। init
vold
को कॉल करता है, और vold init में ईवेंट ट्रिगर करने के लिए गुण सेट करता है। सिस्टम के अन्य हिस्से भी कार्यों को करने के लिए गुणों को देखते हैं जैसे कि रिपोर्ट की स्थिति, पासवर्ड मांगना, या घातक त्रुटि के मामले में फ़ैक्टरी रीसेट के लिए संकेत। cryptfs
में एन्क्रिप्शन सुविधाओं को लागू करने के लिए, सिस्टम कमांड लाइन टूल vdc
के vold
कमांड का उपयोग करता है: 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
के साथ एक नया डिवाइस एन्क्रिप्ट करें: पहले बूट पर अनिवार्य एन्क्रिप्शन (एंड्रॉइड एल में शुरू)। - किसी मौजूदा डिवाइस को एन्क्रिप्ट करें: उपयोगकर्ता द्वारा शुरू किया गया एन्क्रिप्शन (Android K और पुराना)।
-
- एन्क्रिप्टेड डिवाइस को बूट करें:
- एक एन्क्रिप्टेड डिवाइस को बिना पासवर्ड के शुरू करना: एक एन्क्रिप्टेड डिवाइस को बूट करना जिसमें कोई सेट पासवर्ड नहीं है (एंड्रॉइड 5.0 और बाद में चलने वाले उपकरणों के लिए प्रासंगिक)।
- एक एन्क्रिप्टेड डिवाइस को पासवर्ड से शुरू करना: एक एन्क्रिप्टेड डिवाइस को बूट करना जिसमें एक सेट पासवर्ड होता है।
इन प्रवाहों के अलावा, डिवाइस /data
एन्क्रिप्ट करने में भी विफल हो सकता है। प्रत्येक प्रवाह को नीचे विस्तार से समझाया गया है।
फ़ोर्सेन्क्रिप्ट के साथ एक नया डिवाइस एन्क्रिप्ट करें
Android 5.0 डिवाइस के लिए यह सामान्य पहला बूट है।
-
forceencrypt
फ़्लैग के साथ अनएन्क्रिप्टेड फ़ाइल सिस्टम का पता लगाएं/data
एन्क्रिप्टेड नहीं है, लेकिन इसकी आवश्यकता है क्योंकिforceencrypt
इसे अनिवार्य करता है। अनमाउंट/data
। - एन्क्रिप्ट करना शुरू करें
/data
vold.decrypt = "trigger_encryption"
vold
init.rc
है, जिसके कारण वोल्ड बिना पासवर्ड के एन्क्रिप्ट/data
कर देगा। (कोई भी सेट नहीं है क्योंकि यह एक नया उपकरण होना चाहिए।) - माउंट tmpfs
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
फिरro.crypto.tmpfs_options
से लिए गए मापदंडों का उपयोग करके tmpfs RAMDisk पर/data
को माउंट करता है, जो किinit.rc
में सेट है। - प्रारंभ ढांचा
trigger_restart_framework
vold
सेट करें, जो सामान्य बूट प्रक्रिया को जारी रखता है।
किसी मौजूदा डिवाइस को एन्क्रिप्ट करें
ऐसा तब होता है जब आप किसी अनएन्क्रिप्टेड Android K या पुराने डिवाइस को एन्क्रिप्ट करते हैं जिसे L में माइग्रेट किया गया है।
यह प्रक्रिया उपयोगकर्ता द्वारा शुरू की गई है और इसे कोड में "इनप्लेस एन्क्रिप्शन" कहा जाता है। जब कोई उपयोगकर्ता किसी डिवाइस को एन्क्रिप्ट करना चुनता है, तो UI सुनिश्चित करता है कि बैटरी पूरी तरह से चार्ज हो और एसी एडॉप्टर प्लग इन हो ताकि एन्क्रिप्शन प्रक्रिया को पूरा करने के लिए पर्याप्त शक्ति हो।
चेतावनी: यदि डिवाइस की शक्ति समाप्त हो जाती है और एन्क्रिप्ट करना समाप्त होने से पहले बंद हो जाता है, तो फ़ाइल डेटा आंशिक रूप से एन्क्रिप्टेड स्थिति में छोड़ दिया जाता है। डिवाइस फ़ैक्टरी रीसेट होना चाहिए और सभी डेटा खो गया है।
vold
एन्क्रिप्शन को सक्षम करने के लिए, वोल्ड वास्तविक ब्लॉक डिवाइस के प्रत्येक सेक्टर को पढ़ने के लिए एक लूप शुरू करता है और फिर इसे क्रिप्टो ब्लॉक डिवाइस पर लिखता है। vold
यह देखने के लिए जाँच करता है कि क्या कोई सेक्टर इसे पढ़ने और लिखने से पहले उपयोग में है, जो एक नए डिवाइस पर एन्क्रिप्शन को बहुत तेज़ बनाता है जिसमें बहुत कम या कोई डेटा नहीं होता है।
डिवाइस की स्थिति : ro.crypto.state = "unencrypted"
सेट करें और बूटिंग जारी रखने के लिए गैर-एन्क्रिप्टेड init
ट्रिगर on nonencrypted
निष्पादित करें।
- पासवर्ड जांचें
UI, cryptfs
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
का पता लगाएंपता लगाएँ कि Android डिवाइस एन्क्रिप्ट किया गया है क्योंकि
/data
माउंट नहीं किया जा सकता है और एक फ़्लैगforceencrypt
encryptable
है।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.decrypt
vold
सेट करता है:trigger_restart_framework.
यहinit.rc
को फिर सेmain
श्रेणी में सेवाएं शुरू करने का कारण बनता है और बूट के बाद पहली बारlate_start
से शुरू होने वाली कक्षा में सेवाएं भी शुरू करता है। - प्रारंभ ढांचा
अब फ्रेमवर्क डिक्रिप्टेड
/data
का उपयोग करके अपनी सभी सेवाओं को बूट करता है, और सिस्टम उपयोग के लिए तैयार है।
डिफ़ॉल्ट एन्क्रिप्शन के बिना एक एन्क्रिप्टेड डिवाइस शुरू करना
ऐसा तब होता है जब आप एक एन्क्रिप्टेड डिवाइस को बूट करते हैं जिसमें एक सेट पासवर्ड होता है। डिवाइस का पासवर्ड पिन, पैटर्न या पासवर्ड हो सकता है।
- पासवर्ड के साथ एन्क्रिप्टेड डिवाइस का पता लगाएं
पता लगाएं कि एंड्रॉइड डिवाइस एन्क्रिप्ट किया गया है क्योंकि फ्लैग
ro.crypto.state = "encrypted"
vold
vold.decrypt
कोtrigger_restart_min_framework
पर सेट करता है क्योंकि/data
पासवर्ड से एन्क्रिप्ट किया गया है। - माउंट tmpfs
init
/data
के लिए दिए गए प्रारंभिक माउंट विकल्पों कोinit.rc
से पारित पैरामीटर के साथ सहेजने के लिए 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
सफल हो जाता है, तो फ्रेमवर्क एक यूआई प्रदर्शित करता है जो डिस्क पासवर्ड मांगता है। UIcryptfs checkpw
कमांड कोvold
पर भेजकर पासवर्ड की जांच करता है। यदि पासवर्ड सही है (जो किसी अस्थायी स्थान पर डिक्रिप्टेड/data
को सफलतापूर्वक माउंट करके, फिर उसे अनमाउंट करके निर्धारित किया जाता है),vold
ro.crypto.fs_crypto_blkdev
प्रॉपर्टी में डिक्रिप्टेड ब्लॉक डिवाइस का नाम सहेजता है और UI को स्थिति 0 देता है। . यदि पासवर्ड गलत है, तो यह UI को -1 लौटा देता है। - ढांचा बंद करो
UI एक क्रिप्टो बूट ग्राफ़िक लगाता है और फिर
vold
cryptfs restart
कमांड के साथ वोल्ड को कॉल करता है।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 पर सेट करेंगे। एक बार वोल्ड उस संपत्ति में 1 को देखता है, तो यह संपत्तिvold
कोvold.decrypt
पर सेट करtrigger_restart_framework
है। यहinit.rc
को फिर सेmain
श्रेणी में सेवाएं शुरू करने का कारण बनता है और बूट के बाद पहली बारlate_start
से शुरू होने वाली कक्षा में सेवाएं भी शुरू करता है। - पूरा ढांचा शुरू करें
अब फ्रेमवर्क अपनी सभी सेवाओं को डिक्रिप्टेड
/data
फाइल सिस्टम का उपयोग करके बूट करता है, और सिस्टम उपयोग के लिए तैयार है।
असफलता
एक उपकरण जो डिक्रिप्ट करने में विफल रहता है वह कुछ कारणों से गड़बड़ा सकता है। डिवाइस बूट करने के चरणों की सामान्य श्रृंखला के साथ शुरू होता है:
- पासवर्ड के साथ एन्क्रिप्टेड डिवाइस का पता लगाएं
- माउंट tmpfs
- पासवर्ड के लिए प्रांप्ट करने के लिए फ्रेमवर्क शुरू करें
लेकिन फ्रेमवर्क खुलने के बाद, डिवाइस कुछ त्रुटियों का सामना कर सकता है:
- पासवर्ड मेल खाता है लेकिन डेटा को डिक्रिप्ट नहीं कर सकता
- उपयोगकर्ता 30 बार गलत पासवर्ड दर्ज करता है
यदि इन त्रुटियों का समाधान नहीं होता है, तो उपयोगकर्ता को फ़ैक्टरी वाइप करने के लिए संकेत दें :
यदि एन्क्रिप्शन प्रक्रिया के दौरान वोल्ड किसी त्रुटि का पता लगाता है, और यदि कोई डेटा अभी तक नष्ट नहीं हुआ है और ढांचा तैयार है, तो vold
संपत्ति vold.encrypt_progress
को vold
पर सेट error_not_encrypted
है। यूआई उपयोगकर्ता को रीबूट करने के लिए संकेत देता है और उन्हें अलर्ट करता है कि एन्क्रिप्शन प्रक्रिया कभी शुरू नहीं हुई है। यदि फ्रेमवर्क के फटने के बाद त्रुटि होती है, लेकिन प्रगति बार UI के ऊपर होने से पहले, vold
सिस्टम को रिबूट करेगा। यदि रिबूट विफल हो जाता है, तो यह vold.encrypt_progress
को error_shutting_down
पर सेट करता है और -1 देता है; लेकिन त्रुटि पकड़ने के लिए कुछ भी नहीं होगा। ऐसा होने की उम्मीद नहीं है।
यदि एन्क्रिप्शन प्रक्रिया के दौरान vold.encrypt_progress
vold
error_partially_encrypted
पर सेट करता है और -1 देता है। यूआई को तब एक संदेश प्रदर्शित करना चाहिए जिसमें कहा गया हो कि एन्क्रिप्शन विफल हो गया है और उपयोगकर्ता को डिवाइस को फ़ैक्टरी रीसेट करने के लिए एक बटन प्रदान करना चाहिए।
एन्क्रिप्टेड कुंजी को संग्रहीत करना
एन्क्रिप्टेड कुंजी क्रिप्टो मेटाडेटा में संग्रहीत है। हार्डवेयर समर्थन विश्वसनीय निष्पादन पर्यावरण (टीईई) हस्ताक्षर क्षमता का उपयोग करके कार्यान्वित किया जाता है। पहले, हमने मास्टर कुंजी को उपयोगकर्ता के पासवर्ड और संग्रहीत नमक में स्क्रीप्ट लागू करके उत्पन्न कुंजी के साथ एन्क्रिप्ट किया था। ऑफ-बॉक्स हमलों के खिलाफ कुंजी को लचीला बनाने के लिए, हम संग्रहीत टीईई कुंजी के साथ परिणामी कुंजी पर हस्ताक्षर करके इस एल्गोरिदम का विस्तार करते हैं। परिणामी हस्ताक्षर को स्क्रीप्ट के एक और अनुप्रयोग द्वारा उपयुक्त लंबाई की कुंजी में बदल दिया जाता है। इस कुंजी का उपयोग तब मास्टर कुंजी को एन्क्रिप्ट और डिक्रिप्ट करने के लिए किया जाता है। इस कुंजी को स्टोर करने के लिए:
- यादृच्छिक 16-बाइट डिस्क एन्क्रिप्शन कुंजी (DEK) और 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 के रूप में उपयोग करें।
- DEK को AES_CBC के साथ एन्क्रिप्ट करें, कुंजी KEK और इनिशियलाइज़ेशन वेक्टर IV के साथ।
पासवर्ड बदलना
जब कोई उपयोगकर्ता सेटिंग में अपना पासवर्ड बदलने या हटाने का चुनाव करता है, तो UI cryptfs changepw
कमांड को vold
पर भेजता है, और vold
नए पासवर्ड के साथ डिस्क मास्टर कुंजी को फिर से एन्क्रिप्ट करता है।
एन्क्रिप्शन गुण
vold
और init
गुण सेट करके एक दूसरे के साथ संवाद करते हैं। एन्क्रिप्शन के लिए उपलब्ध गुणों की एक सूची यहां दी गई है।
वोल्ड गुण
संपत्ति | विवरण |
---|---|
vold.decrypt trigger_encryption | बिना पासवर्ड के ड्राइव को एन्क्रिप्ट करें। |
vold.decrypt trigger_default_encryption | यह देखने के लिए ड्राइव की जाँच करें कि क्या यह बिना पासवर्ड के एन्क्रिप्टेड है। यदि यह है, तो इसे डिक्रिप्ट और माउंट करें, अन्यथा vold.decrypt को ट्रिगर_रेस्टार्ट_मिन_फ्रेमवर्क पर सेट करें। |
vold.decrypt trigger_reset_main | डिस्क पासवर्ड मांगने वाले UI को शटडाउन करने के लिए vold द्वारा सेट करें। |
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 | प्रोग्रेस बार यूआई को एक संदेश प्रदर्शित करना चाहिए जिसमें कहा गया है कि एन्क्रिप्शन पूरा हो गया है, और उपयोगकर्ता को डिवाइस को रीबूट करने के लिए एक बटन देना चाहिए। यह त्रुटि होने की उम्मीद नहीं है। |
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 द्वारा सेट किया जाता है जब यह /data init.rc से पारित पैरामीटर के साथ माउंट करने का प्रयास करता है। 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