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

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

एंड्रॉइड के लिए 4.4 में फुल-डिस्क एन्क्रिप्शन पेश किया गया था, लेकिन एंड्रॉइड 5.0 ने इन नई सुविधाओं को पेश किया:

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

सावधानी: डिवाइस Android 5.0 करने के लिए उन्नत और फिर एन्क्रिप्टेड फ़ैक्टरी डेटा रीसेट द्वारा एन्क्रिप्ट न किए गए राज्य को लौट जा सकता है। पहले बूट पर एन्क्रिप्ट किए गए नए Android 5.0 डिवाइस को अनएन्क्रिप्टेड स्थिति में वापस नहीं किया जा सकता है।

Android पूर्ण-डिस्क एन्क्रिप्शन कैसे काम करता है

एंड्रॉयड पूर्ण डिस्क एन्क्रिप्शन पर आधारित है dm-crypt है, जो एक कर्नेल विशेषता है कि ब्लॉक युक्ति परत पर काम करता है। इस वजह से, एंबेडेड MultiMediaCard (eMMC) और इसी तरह फ़्लैश उपकरणों के साथ काम करता है एन्क्रिप्शन कि खुद ब्लॉक उपकरणों के रूप में कर्नेल में प्रस्तुत करते हैं। YAFFS के साथ एन्क्रिप्शन संभव नहीं है, जो सीधे कच्चे NAND फ्लैश चिप से बात करता है।

एन्क्रिप्शन एल्गोरिथम 128 उन्नत एन्क्रिप्शन स्टैंडर्ड (एईएस) है जिसमें सिफर-ब्लॉक चेनिंग (सीबीसी) और ईएसएसआईवी: एसएचए256 शामिल हैं। मास्टर कुंजी को ओपनएसएसएल लाइब्रेरी में कॉल के माध्यम से 128-बिट एईएस के साथ एन्क्रिप्ट किया गया है। आपको कुंजी के लिए 128 बिट या अधिक का उपयोग करना चाहिए (256 वैकल्पिक होने के साथ)।

नोट: ओईएम मास्टर कुंजी एन्क्रिप्ट करने 128 बिट या उच्चतर का उपयोग कर सकते हैं।

Android 5.0 रिलीज़ में, चार प्रकार की एन्क्रिप्शन स्थितियाँ हैं:

  • चूक जाना
  • पिन
  • पासवर्ड
  • प्रतिरूप

पहले बूट पर, डिवाइस बेतरतीब ढंग से उत्पन्न 128-बिट मास्टर कुंजी बनाता है और फिर इसे एक डिफ़ॉल्ट पासवर्ड और संग्रहीत नमक के साथ हैश करता है। डिफ़ॉल्ट पासवर्ड है: "डिफ़ॉल्ट_पासवर्ड" हालांकि, परिणामी हैश को एक टीईई (जैसे ट्रस्टज़ोन) के माध्यम से भी हस्ताक्षरित किया जाता है, जो मास्टर कुंजी को एन्क्रिप्ट करने के लिए हस्ताक्षर के हैश का उपयोग करता है।

आप डिफ़ॉल्ट पासवर्ड एंड्रॉयड ओपन सोर्स प्रोजेक्ट में परिभाषित पा सकते हैं cryptfs.cpp फ़ाइल।

जब उपयोगकर्ता डिवाइस पर पिन/पास या पासवर्ड सेट करता है, तो केवल 128-बिट कुंजी को फिर से एन्क्रिप्ट और संग्रहीत किया जाता है। (यानी। उपयोगकर्ता पिन / पास / पैटर्न में परिवर्तन कारण userdata की फिर से एन्क्रिप्शन नहीं है।) ध्यान दें कि प्रबंधित डिवाइस पिन, पैटर्न या पासवर्ड प्रतिबंधों के अधीन हो सकता है।

एन्क्रिप्शन द्वारा किया जाता है init और voldinit कॉल vold init में ट्रिगर घटनाओं के लिए, और Vold सेट गुण। सिस्टम के अन्य हिस्से भी कार्यों को करने के लिए गुणों को देखते हैं जैसे कि रिपोर्ट की स्थिति, पासवर्ड मांगना, या घातक त्रुटि के मामले में फ़ैक्टरी रीसेट के लिए संकेत। में एन्क्रिप्शन सुविधाओं को लागू करने की 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 decrypted किया गया है और रखा होगा।

इन कार्यों को गति प्रदान करने के लिए, 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" चलाता init.rc है, जो कारण होगा vold एन्क्रिप्ट करने के लिए /data कोई पासवर्ड के साथ। (कोई भी सेट नहीं है क्योंकि यह एक नया उपकरण होना चाहिए।)

  3. माउंट tmpfs

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

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

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

  5. जब /data एन्क्रिप्टेड है, ढांचे के नीचे ले

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

  6. माउंट /data

    init तो माउंट /data एक tmpfs पर मानकों का प्रयोग करके इसे से ऊपर उठाता है रैमडिस्क ro.crypto.tmpfs_options , जिसमें सेट कर दिया जाता init.rc

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

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

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

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

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

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

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

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

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

    यूआई कॉल 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 तो क्रिप्टो मानचित्रण, जो एक आभासी क्रिप्टो ब्लॉक युक्ति बनाता है कि असली ब्लॉक डिवाइस पर नक्शे लेकिन प्रत्येक क्षेत्र के रूप में यह लिखा है एन्क्रिप्ट करता है और प्रत्येक क्षेत्र decrypts के रूप में यह पढ़ा है सेट करता है। vold तो बनाता है और क्रिप्टो मेटाडाटा बाहर लिखता है।

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

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

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

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

  10. जब /data एन्क्रिप्टेड है, क्रिप्टो पाद लेख को अद्यतन

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

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

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

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

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

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

    का पता लगाने कि क्योंकि एंड्रॉयड डिवाइस एन्क्रिप्टेड है /data माउंट नहीं किया जा सकता है और झंडे में से एक encryptable या forceencrypt निर्धारित है।

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

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

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

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

    vold तो decrypted असली mounts /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 बूट के बाद से पहली बार के लिए।

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

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

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

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

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

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

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

  2. माउंट tmpfs

    init सेट पाँच गुण प्रारंभिक विकल्प माउंट के लिए दिए गए बचाने के लिए /data से पारित कर दिया मानकों के साथ init.rcvold इन गुणों का उपयोग करता क्रिप्टो मानचित्रण स्थापित करने के लिए:

    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 को voldvold रिटर्न 0 यदि एन्क्रिप्शन सफलतापूर्वक पूरा कर लिया गया था, -1 आंतरिक त्रुटि पर, या -2 यदि एन्क्रिप्शन सफलतापूर्वक पूर्ण नहीं किया गया था। vold के लिए क्रिप्टो मेटाडाटा में डाल कर इस निर्धारित करता है CRYPTO_ENCRYPTION_IN_PROGRESS झंडा। यदि यह सेट है, तो एन्क्रिप्शन प्रक्रिया बाधित हो गई थी, और डिवाइस पर कोई उपयोग करने योग्य डेटा नहीं है। यदि vold एक त्रुटि देता है, यूआई रिबूट और कारखाने के लिए उपयोगकर्ता के लिए संदेश प्रदर्शित करना चाहिए डिवाइस रीसेट, और उपयोगकर्ता ऐसा करने के लिए प्रेस के लिए एक बटन दे।

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

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

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

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

  6. माउंट /data

    vold तो decrypted असली mounts /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 बूट के बाद से पहली बार के लिए।

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

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

असफलता

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

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

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

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

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

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

  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 के साथ।

पासवर्ड बदलना

परिवर्तन के लिए एक उपयोगकर्ता का चुनाव करता है या सेटिंग में उनके पासवर्ड निकाल देते हैं, यूआई आदेश भेजता है cryptfs changepw को vold , और vold फिर से एन्क्रिप्ट करता है नए पासवर्ड के साथ डिस्क मास्टर कुंजी।

एन्क्रिप्शन गुण

vold और init गुण सेट करके दूसरे के साथ संवाद। एन्क्रिप्शन के लिए उपलब्ध गुणों की एक सूची यहां दी गई है।

वोल्ड गुण

संपत्ति विवरण
vold.decrypt trigger_encryption बिना पासवर्ड के ड्राइव को एन्क्रिप्ट करें।
vold.decrypt trigger_default_encryption यह देखने के लिए ड्राइव जांचें कि क्या यह बिना पासवर्ड के एन्क्रिप्ट किया गया है। यदि यह, डिक्रिप्ट और यह माउंट, और सेट है vold.decrypt trigger_restart_min_framework करने के लिए।
vold.decrypt trigger_reset_main डिस्क पासवर्ड मांगने वाले UI को शटडाउन करने के लिए vold द्वारा सेट करें।
vold.decrypt trigger_post_fs_data तैयार करने के लिए Vold द्वारा निर्धारित करें /data आवश्यक निर्देशिका, एट अल के साथ।
vold.decrypt trigger_restart_framework वास्तविक ढांचे और सभी सेवाओं को शुरू करने के लिए वोल्ड द्वारा निर्धारित करें।
vold.decrypt trigger_shutdown_framework एन्क्रिप्शन शुरू करने के लिए पूर्ण ढांचे को बंद करने के लिए वोल्ड द्वारा सेट करें।
vold.decrypt trigger_restart_min_framework Vold द्वारा निर्धारित करें एन्क्रिप्शन के लिए प्रगति बार यूआई शुरू करने के लिए या पासवर्ड के लिए शीघ्र, के मूल्य के आधार ro.crypto.state
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 सिर्फ सेट करने से पहले vold.decrypt को trigger_post_fs_data
vold.post_fs_data_done 1 द्वारा सेट init.rc या init.rc बस काम खत्म करने के बाद post-fs-data

init गुण

संपत्ति विवरण
ro.crypto.fs_crypto_blkdev द्वारा निर्धारित करें vold आदेश checkpw से बाद में उपयोग के vold आदेश restart
ro.crypto.state unencrypted द्वारा सेट init इस प्रणाली से एन्क्रिप्ट न किए साथ चल रहा है कहने के लिए /data ro.crypto.state encrypted । द्वारा निर्धारित करें init इस प्रणाली एक एन्क्रिप्टेड साथ चल रहा है कहने के लिए /data

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.rcvold सेटअप करने के लिए क्रिप्टो मानचित्रण इन उपयोग करता है।
ro.crypto.tmpfs_options द्वारा सेट init.rc विकल्प देता है जब tmpfs बढ़ते init का उपयोग करना चाहिए साथ /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