पूर्ण-डिस्क एन्क्रिप्शन

पूर्ण-डिस्क एन्क्रिप्शन एक एन्क्रिप्टेड कुंजी का उपयोग करके एंड्रॉइड डिवाइस पर सभी उपयोगकर्ता डेटा को एन्कोड करने की प्रक्रिया है। एक बार डिवाइस को एन्क्रिप्ट करने के बाद, सभी उपयोगकर्ता द्वारा बनाए गए डेटा को डिस्क पर करने से पहले स्वचालित रूप से एन्क्रिप्ट किया जाता है और कॉलिंग प्रक्रिया में वापस आने से पहले सभी डेटा को स्वचालित रूप से डिक्रिप्ट पढ़ता है।

एंड्रॉइड के लिए 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 डिवाइस के लिए यह सामान्य पहला बूट है।

  1. forceencrypt फ़्लैग के साथ अनएन्क्रिप्टेड फ़ाइल सिस्टम का पता लगाएं

    /data एन्क्रिप्टेड नहीं है, लेकिन इसकी आवश्यकता है क्योंकि forceencrypt इसे अनिवार्य करता है। अनमाउंट /data

  2. एन्क्रिप्ट करना शुरू करें /data

    vold.decrypt = "trigger_encryption" vold init.rc है, जिसके कारण वोल्ड बिना पासवर्ड के एन्क्रिप्ट /data कर देगा। (कोई भी सेट नहीं है क्योंकि यह एक नया उपकरण होना चाहिए।)

  3. माउंट tmpfs

    vold एक tmpfs /data ( ro.crypto.tmpfs_options से tmpfs विकल्पों का उपयोग करके) को माउंट करता है और संपत्ति vold.encrypt_progress को 0 पर सेट करता है। vold एक एन्क्रिप्टेड सिस्टम को बूट करने के लिए tmpfs /data तैयार करता है और संपत्ति vold.decrypt को इस पर सेट करता है: trigger_restart_min_framework

  4. प्रगति दिखाने के लिए रूपरेखा तैयार करें

    चूंकि डिवाइस में एन्क्रिप्ट करने के लिए वस्तुतः कोई डेटा नहीं है, इसलिए प्रगति पट्टी अक्सर वास्तव में दिखाई नहीं देगी क्योंकि एन्क्रिप्शन इतनी जल्दी होता है। प्रगति UI के बारे में अधिक विवरण के लिए मौजूदा डिवाइस को एन्क्रिप्ट करें देखें।

  5. जब /data एन्क्रिप्ट किया गया हो, तो फ्रेमवर्क को नीचे ले जाएं

    vold vold.decrypt को trigger_default_encryption पर सेट करता है जो defaultcrypto सेवा शुरू करता है। (यह एक डिफ़ॉल्ट एन्क्रिप्टेड उपयोगकर्ता डेटा माउंट करने के लिए नीचे प्रवाह शुरू करता है।) trigger_default_encryption एन्क्रिप्शन प्रकार की जांच करता है यह देखने के लिए कि क्या /data पासवर्ड के साथ या बिना एन्क्रिप्ट किया गया है। चूंकि एंड्रॉइड 5.0 डिवाइस पहले बूट पर एन्क्रिप्ट किए गए हैं, इसलिए कोई पासवर्ड सेट नहीं होना चाहिए; इसलिए हम डिक्रिप्ट और माउंट /data

  6. माउंट /data

    init फिर ro.crypto.tmpfs_options से लिए गए मापदंडों का उपयोग करके tmpfs RAMDisk पर /data को माउंट करता है, जो कि init.rc में सेट है।

  7. प्रारंभ ढांचा

    trigger_restart_framework vold सेट करें, जो सामान्य बूट प्रक्रिया को जारी रखता है।

किसी मौजूदा डिवाइस को एन्क्रिप्ट करें

ऐसा तब होता है जब आप किसी अनएन्क्रिप्टेड Android K या पुराने डिवाइस को एन्क्रिप्ट करते हैं जिसे L में माइग्रेट किया गया है।

यह प्रक्रिया उपयोगकर्ता द्वारा शुरू की गई है और इसे कोड में "इनप्लेस एन्क्रिप्शन" कहा जाता है। जब कोई उपयोगकर्ता किसी डिवाइस को एन्क्रिप्ट करना चुनता है, तो UI सुनिश्चित करता है कि बैटरी पूरी तरह से चार्ज हो और एसी एडॉप्टर प्लग इन हो ताकि एन्क्रिप्शन प्रक्रिया को पूरा करने के लिए पर्याप्त शक्ति हो।

चेतावनी: यदि डिवाइस की शक्ति समाप्त हो जाती है और एन्क्रिप्ट करना समाप्त होने से पहले बंद हो जाता है, तो फ़ाइल डेटा आंशिक रूप से एन्क्रिप्टेड स्थिति में छोड़ दिया जाता है। डिवाइस फ़ैक्टरी रीसेट होना चाहिए और सभी डेटा खो गया है।

vold एन्क्रिप्शन को सक्षम करने के लिए, वोल्ड वास्तविक ब्लॉक डिवाइस के प्रत्येक सेक्टर को पढ़ने के लिए एक लूप शुरू करता है और फिर इसे क्रिप्टो ब्लॉक डिवाइस पर लिखता है। vold यह देखने के लिए जाँच करता है कि क्या कोई सेक्टर इसे पढ़ने और लिखने से पहले उपयोग में है, जो एक नए डिवाइस पर एन्क्रिप्शन को बहुत तेज़ बनाता है जिसमें बहुत कम या कोई डेटा नहीं होता है।

डिवाइस की स्थिति : ro.crypto.state = "unencrypted" सेट करें और बूटिंग जारी रखने के लिए गैर-एन्क्रिप्टेड init ट्रिगर on nonencrypted निष्पादित करें।

  1. पासवर्ड जांचें

    UI, cryptfs vold cryptfs enablecrypto inplace कमांड के साथ वॉल्ड कॉल करता है, जहां passwd यूजर का लॉक स्क्रीन पासवर्ड होता है।

  2. ढांचा नीचे ले लो

    त्रुटियों के लिए vold जाँच करता है, -1 देता है यदि यह एन्क्रिप्ट नहीं कर सकता है, और लॉग में एक कारण प्रिंट करता है। यदि यह एन्क्रिप्ट कर सकता है, तो यह संपत्ति vold.decrypt को trigger_shutdown_framework पर सेट करता है। यह init.rc को देर से late_start और main कक्षाओं में सेवाओं को रोकने का कारण बनता है।

  3. एक क्रिप्टो फूटर बनाएं
  4. ब्रेडक्रंब फ़ाइल बनाएं
  5. रीबूट
  6. ब्रेडक्रंब फ़ाइल का पता लगाएं
  7. एन्क्रिप्ट करना शुरू करें /data

    vold फिर क्रिप्टो मैपिंग सेट करता है, जो एक वर्चुअल क्रिप्टो ब्लॉक डिवाइस बनाता है जो वास्तविक ब्लॉक डिवाइस पर मैप करता है लेकिन प्रत्येक सेक्टर को लिखे जाने पर एन्क्रिप्ट करता है, और प्रत्येक सेक्टर को डिक्रिप्ट करता है जैसा कि पढ़ा जाता है। vold फिर क्रिप्टो मेटाडेटा बनाता और लिखता है।

  8. एन्क्रिप्ट करते समय, tmpfs माउंट करें

    vold एक tmpfs /data ( ro.crypto.tmpfs_options से tmpfs विकल्पों का उपयोग करके) को माउंट करता है और संपत्ति vold.encrypt_progress को 0 पर सेट करता है। vold एक एन्क्रिप्टेड सिस्टम को बूट करने के लिए tmpfs /data तैयार करता है और संपत्ति vold.decrypt को इस पर सेट करता है: trigger_restart_min_framework

  9. प्रगति दिखाने के लिए रूपरेखा तैयार करें

    trigger_restart_min_framework सेवाओं के main वर्ग को शुरू करने के लिए init.rc का कारण बनता है। जब फ्रेमवर्क देखता है कि vold.encrypt_progress 0 पर सेट है, तो यह प्रोग्रेस बार UI लाता है, जो हर पांच सेकंड में उस प्रॉपर्टी से पूछताछ करता है और एक प्रोग्रेस बार को अपडेट करता है। एन्क्रिप्शन लूप हर बार विभाजन के दूसरे प्रतिशत को एन्क्रिप्ट करने पर vold.encrypt_progress को अपडेट करता है।

  10. जब /data एन्क्रिप्ट किया गया हो, तो क्रिप्टो फ़ुटर अपडेट करें

    जब /data सफलतापूर्वक एन्क्रिप्ट किया जाता है, तो vold मेटाडेटा में ध्वज ENCRYPTION_IN_PROGRESS को साफ़ करता है।

    जब डिवाइस को सफलतापूर्वक अनलॉक किया जाता है, तो पासवर्ड का उपयोग मास्टर कुंजी को एन्क्रिप्ट करने के लिए किया जाता है और क्रिप्टो फूटर अपडेट किया जाता है।

    यदि किसी कारण से रिबूट विफल हो जाता है, तो vold संपत्ति vold.encrypt_progress को error_reboot_failed पर सेट करता है और UI को एक संदेश प्रदर्शित करना चाहिए जिसमें उपयोगकर्ता को रिबूट करने के लिए एक बटन दबाने के लिए कहा जाए। ऐसा कभी होने की उम्मीद नहीं है।

डिफ़ॉल्ट एन्क्रिप्शन के साथ एक एन्क्रिप्टेड डिवाइस शुरू करना

ऐसा तब होता है जब आप बिना पासवर्ड वाले एन्क्रिप्टेड डिवाइस को बूट करते हैं। चूंकि एंड्रॉइड 5.0 डिवाइस पहले बूट पर एन्क्रिप्ट किए गए हैं, इसलिए कोई सेट पासवर्ड नहीं होना चाहिए और इसलिए यह डिफ़ॉल्ट एन्क्रिप्शन स्थिति है।

  1. बिना पासवर्ड वाले एन्क्रिप्टेड /data का पता लगाएं

    पता लगाएँ कि Android डिवाइस एन्क्रिप्ट किया गया है क्योंकि /data माउंट नहीं किया जा सकता है और एक फ़्लैग forceencrypt encryptable है।

    vold vold.decrypt को trigger_default_encryption पर सेट करता है, जो defaultcrypto सेवा शुरू करता है। trigger_default_encryption एन्क्रिप्शन प्रकार की जाँच करता है यह देखने के लिए कि क्या /data पासवर्ड के साथ या बिना एन्क्रिप्ट किया गया है।

  2. डिक्रिप्ट / डेटा

    ब्लॉक डिवाइस पर dm-crypt डिवाइस बनाता है ताकि डिवाइस उपयोग के लिए तैयार हो।

  3. माउंट / डेटा

    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 से शुरू होने वाली कक्षा में सेवाएं भी शुरू करता है।

  4. प्रारंभ ढांचा

    अब फ्रेमवर्क डिक्रिप्टेड /data का उपयोग करके अपनी सभी सेवाओं को बूट करता है, और सिस्टम उपयोग के लिए तैयार है।

डिफ़ॉल्ट एन्क्रिप्शन के बिना एक एन्क्रिप्टेड डिवाइस शुरू करना

ऐसा तब होता है जब आप एक एन्क्रिप्टेड डिवाइस को बूट करते हैं जिसमें एक सेट पासवर्ड होता है। डिवाइस का पासवर्ड पिन, पैटर्न या पासवर्ड हो सकता है।

  1. पासवर्ड के साथ एन्क्रिप्टेड डिवाइस का पता लगाएं

    पता लगाएं कि एंड्रॉइड डिवाइस एन्क्रिप्ट किया गया है क्योंकि फ्लैग ro.crypto.state = "encrypted"

    vold vold.decrypt को trigger_restart_min_framework पर सेट करता है क्योंकि /data पासवर्ड से एन्क्रिप्ट किया गया है।

  2. माउंट tmpfs

    init /data के लिए दिए गए प्रारंभिक माउंट विकल्पों को init.rc से पारित पैरामीटर के साथ सहेजने के लिए init पांच गुण सेट करता है। क्रिप्टो मैपिंग सेट करने के लिए vold इन गुणों का उपयोग करता है:

    1. ro.crypto.fs_type
    2. ro.crypto.fs_real_blkdev
    3. ro.crypto.fs_mnt_point
    4. ro.crypto.fs_options
    5. ro.crypto.fs_flags (ASCII 8-अंकीय हेक्स संख्या 0x से पहले)
  3. पासवर्ड के लिए प्रांप्ट करने के लिए फ्रेमवर्क शुरू करें

    ढांचा शुरू होता है और देखता है कि vold.decrypt को trigger_restart_min_framework पर सेट किया गया है। यह फ्रेमवर्क को बताता है कि यह tmpfs /data डिस्क पर बूट हो रहा है और इसे उपयोगकर्ता पासवर्ड प्राप्त करने की आवश्यकता है।

    सबसे पहले, हालांकि, यह सुनिश्चित करने की आवश्यकता है कि डिस्क ठीक से एन्क्रिप्ट की गई थी। यह cryptfs cryptocomplete को vold पर कमांड भेजता है। यदि एन्क्रिप्शन सफलतापूर्वक पूरा किया गया था, तो vold 0 देता है, आंतरिक त्रुटि पर -1, या -2 यदि एन्क्रिप्शन सफलतापूर्वक पूरा नहीं हुआ था। vold CRYPTO_ENCRYPTION_IN_PROGRESS ध्वज के लिए क्रिप्टो मेटाडेटा को देखकर इसे निर्धारित करता है। यदि यह सेट है, तो एन्क्रिप्शन प्रक्रिया बाधित हो गई थी, और डिवाइस पर कोई उपयोग करने योग्य डेटा नहीं है। यदि vold कोई त्रुटि देता है, तो UI को उपयोगकर्ता को डिवाइस को रीबूट करने और फ़ैक्टरी रीसेट करने के लिए एक संदेश प्रदर्शित करना चाहिए, और उपयोगकर्ता को ऐसा करने के लिए प्रेस करने के लिए एक बटन देना चाहिए।

  4. पासवर्ड के साथ डेटा डिक्रिप्ट करें

    एक बार जब cryptfs cryptocomplete सफल हो जाता है, तो फ्रेमवर्क एक यूआई प्रदर्शित करता है जो डिस्क पासवर्ड मांगता है। UI cryptfs checkpw कमांड को vold पर भेजकर पासवर्ड की जांच करता है। यदि पासवर्ड सही है (जो किसी अस्थायी स्थान पर डिक्रिप्टेड /data को सफलतापूर्वक माउंट करके, फिर उसे अनमाउंट करके निर्धारित किया जाता है), vold ro.crypto.fs_crypto_blkdev प्रॉपर्टी में डिक्रिप्टेड ब्लॉक डिवाइस का नाम सहेजता है और UI को स्थिति 0 देता है। . यदि पासवर्ड गलत है, तो यह UI को -1 लौटा देता है।

  5. ढांचा बंद करो

    UI एक क्रिप्टो बूट ग्राफ़िक लगाता है और फिर vold cryptfs restart कमांड के साथ वोल्ड को कॉल करता है। vold संपत्ति को vold.decrypt को trigger_reset_main पर सेट करता है, जो init.rc को class_reset main करने का कारण बनता है। यह मुख्य वर्ग में सभी सेवाओं को रोकता है, जो tmpfs /data को अनमाउंट करने की अनुमति देता है।

  6. माउंट /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 से शुरू होने वाली कक्षा में सेवाएं भी शुरू करता है।

  7. पूरा ढांचा शुरू करें

    अब फ्रेमवर्क अपनी सभी सेवाओं को डिक्रिप्टेड /data फाइल सिस्टम का उपयोग करके बूट करता है, और सिस्टम उपयोग के लिए तैयार है।

असफलता

एक उपकरण जो डिक्रिप्ट करने में विफल रहता है वह कुछ कारणों से गड़बड़ा सकता है। डिवाइस बूट करने के चरणों की सामान्य श्रृंखला के साथ शुरू होता है:

  1. पासवर्ड के साथ एन्क्रिप्टेड डिवाइस का पता लगाएं
  2. माउंट tmpfs
  3. पासवर्ड के लिए प्रांप्ट करने के लिए फ्रेमवर्क शुरू करें

लेकिन फ्रेमवर्क खुलने के बाद, डिवाइस कुछ त्रुटियों का सामना कर सकता है:

  • पासवर्ड मेल खाता है लेकिन डेटा को डिक्रिप्ट नहीं कर सकता
  • उपयोगकर्ता 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 देता है। यूआई को तब एक संदेश प्रदर्शित करना चाहिए जिसमें कहा गया हो कि एन्क्रिप्शन विफल हो गया है और उपयोगकर्ता को डिवाइस को फ़ैक्टरी रीसेट करने के लिए एक बटन प्रदान करना चाहिए।

एन्क्रिप्टेड कुंजी को संग्रहीत करना

एन्क्रिप्टेड कुंजी क्रिप्टो मेटाडेटा में संग्रहीत है। हार्डवेयर समर्थन विश्वसनीय निष्पादन पर्यावरण (टीईई) हस्ताक्षर क्षमता का उपयोग करके कार्यान्वित किया जाता है। पहले, हमने मास्टर कुंजी को उपयोगकर्ता के पासवर्ड और संग्रहीत नमक में स्क्रीप्ट लागू करके उत्पन्न कुंजी के साथ एन्क्रिप्ट किया था। ऑफ-बॉक्स हमलों के खिलाफ कुंजी को लचीला बनाने के लिए, हम संग्रहीत टीईई कुंजी के साथ परिणामी कुंजी पर हस्ताक्षर करके इस एल्गोरिदम का विस्तार करते हैं। परिणामी हस्ताक्षर को स्क्रीप्ट के एक और अनुप्रयोग द्वारा उपयुक्त लंबाई की कुंजी में बदल दिया जाता है। इस कुंजी का उपयोग तब मास्टर कुंजी को एन्क्रिप्ट और डिक्रिप्ट करने के लिए किया जाता है। इस कुंजी को स्टोर करने के लिए:

  1. यादृच्छिक 16-बाइट डिस्क एन्क्रिप्शन कुंजी (DEK) और 16-बाइट नमक उत्पन्न करें।
  2. 32-बाइट इंटरमीडिएट की 1 (IK1) बनाने के लिए यूजर पासवर्ड और नमक पर स्क्रीप्ट लागू करें।
  3. पैड IK1 शून्य बाइट्स के साथ हार्डवेयर-बाउंड प्राइवेट की (HBK) के आकार का। विशेष रूप से, हम इस प्रकार पैड करते हैं: 00 || आईके1 || 00..00; एक शून्य बाइट, 32 IK1 बाइट्स, 223 शून्य बाइट्स।
  4. 256-बाइट IK2 का उत्पादन करने के लिए HBK के साथ गद्देदार IK1 पर हस्ताक्षर करें।
  5. 32-बाइट IK3 का उत्पादन करने के लिए IK2 और नमक (चरण 2 के समान नमक) पर स्क्रीप्ट लागू करें।
  6. IK3 के पहले 16 बाइट्स को KEK के रूप में और अंतिम 16 बाइट्स को IV के रूप में उपयोग करें।
  7. 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 के साथ चल रहा है।

ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags

इन पांच गुणों को 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