एंड्रॉयड 7.0 और बाद का समर्थन करता है फ़ाइल आधारित एन्क्रिप्शन (FBE)। एफबीई अलग-अलग फाइलों को अलग-अलग कुंजियों से एन्क्रिप्ट करने की अनुमति देता है जिन्हें स्वतंत्र रूप से अनलॉक किया जा सकता है। इन कुंजियों का उपयोग फ़ाइल सामग्री और फ़ाइल नाम दोनों को एन्क्रिप्ट करने के लिए किया जाता है। जब FBE का उपयोग किया जाता है, तो अन्य जानकारी, जैसे निर्देशिका लेआउट, फ़ाइल आकार, अनुमतियाँ, और निर्माण/संशोधन समय, एन्क्रिप्ट नहीं किया जाता है। सामूहिक रूप से, इस अन्य जानकारी को फाइलसिस्टम मेटाडेटा के रूप में जाना जाता है।
एंड्रॉइड 9 ने मेटाडेटा एन्क्रिप्शन के लिए समर्थन पेश किया। मेटाडेटा एन्क्रिप्शन के साथ, बूट समय पर मौजूद एक एकल कुंजी जो भी सामग्री FBE द्वारा एन्क्रिप्ट नहीं की गई है, उसे एन्क्रिप्ट करती है। यह कुंजी कीमास्टर द्वारा सुरक्षित है, जो बदले में सत्यापित बूट द्वारा सुरक्षित है।
मेटाडाटा एन्क्रिप्शन हमेशा पर सक्षम है ग्रहणीय भंडारण जब भी FBE सक्षम है। मेटाडेटा एन्क्रिप्शन को आंतरिक संग्रहण पर भी सक्षम किया जा सकता है। Android 11 या उच्चतर के साथ लॉन्च किए गए डिवाइस में आंतरिक संग्रहण पर मेटाडेटा एन्क्रिप्शन सक्षम होना चाहिए।
आंतरिक भंडारण पर कार्यान्वयन
आप की स्थापना करके नए उपकरणों की आंतरिक मेमोरी में मेटाडाटा एन्क्रिप्शन सेट कर सकते हैं metadata
फाइल सिस्टम, init अनुक्रम में परिवर्तन, और डिवाइस के fstab फाइल में मेटाडाटा एन्क्रिप्शन सक्षम करने से।
आवश्यक शर्तें
मेटाडेटा एन्क्रिप्शन केवल तभी सेट किया जा सकता है जब डेटा विभाजन को पहले स्वरूपित किया गया हो। परिणामस्वरूप, यह सुविधा केवल नए उपकरणों के लिए है; यह ऐसा कुछ नहीं है जिसे ओटीए को बदलना चाहिए।
मेटाडाटा एन्क्रिप्शन कि आवश्यकता है dm-default-key
मॉड्यूल आपके कर्नेल में सक्षम होना। एंड्रॉयड 11 और में अधिक है, dm-default-key
एंड्रॉयड आम कर्नेल, संस्करण 4.14 और उच्च द्वारा समर्थित है। के इस संस्करण में dm-default-key
एक हार्डवेयर और विक्रेता स्वतंत्र एन्क्रिप्शन ढांचे बुलाया blk-क्रिप्टो उपयोग करता है।
सक्षम करने के लिए dm-default-key
, का उपयोग करें:
CONFIG_BLK_INLINE_ENCRYPTION=y CONFIG_FS_ENCRYPTION_INLINE_CRYPT=y CONFIG_DM_DEFAULT_KEY=y
dm-default-key
एन्क्रिप्शन हार्डवेयर इनलाइन उपयोग करता है (हार्डवेयर कि encrypts / decrypts डेटा जबकि यह संग्रहण उपकरण / करने के लिए रास्ते पर है) जब उपलब्ध। आप इनलाइन एन्क्रिप्शन हार्डवेयर का उपयोग नहीं किया जाएगा, यह भी कर्नेल के क्रिप्टोग्राफी एपीआई के लिए एक वापस आने में सक्षम करने के लिए आवश्यक है:
CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
इनलाइन एन्क्रिप्शन हार्डवेयर का उपयोग नहीं जब आप के रूप में भी में सिफारिश की किसी भी उपलब्ध सीपीयू आधारित त्वरण सक्षम होना चाहिए FBE प्रलेखन ।
एंड्रॉयड 10 तथा उससे पूर्व में dm-default-key
एंड्रॉयड आम गिरी द्वारा समर्थित नहीं किया गया था। इसे लागू करने के विक्रेताओं के लिए ऊपर इसलिए था dm-default-key
।
मेटाडेटा फ़ाइल सिस्टम सेट करें
चूंकि मेटाडेटा एन्क्रिप्शन कुंजी मौजूद होने तक उपयोगकर्ताडेटा विभाजन में कुछ भी नहीं पढ़ा जा सकता है, विभाजन तालिका को इस कुंजी की रक्षा करने वाले कीमास्टर ब्लॉब्स को संग्रहीत करने के लिए "मेटाडेटा विभाजन" नामक एक अलग विभाजन को अलग करना होगा। मेटाडेटा विभाजन 16 एमबी होना चाहिए।
fstab.hardware
मेटाडाटा फाइल सिस्टम है कि जो पार्टीशन पर जीवन में यह बढ़ते के लिए एक प्रवेश को शामिल करना चाहिए /metadata
, सहित formattable
झंडा सुनिश्चित करने के लिए यह बूट समय पर स्वरूपित है। f2fs फाइल सिस्टम छोटे विभाजन पर काम नहीं करता है; हम इसके बजाय ext4 का उपयोग करने की सलाह देते हैं। उदाहरण के लिए:
/dev/block/bootdevice/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard wait,check,formattable
यह सुनिश्चित करने के /metadata
माउंट बिंदु मौजूद है, के लिए निम्न पंक्ति जोड़ें BoardConfig-common.mk
:
BOARD_USES_METADATA_PARTITION := true
इनिट अनुक्रम में परिवर्तन
जब मेटाडाटा एन्क्रिप्शन प्रयोग किया जाता है, vold
से पहले चलना चाहिए /data
खड़ा होता है। यह सुनिश्चित करें कि यह काफी पहले शुरू कर दिया है, के लिए निम्न श्लोक जोड़ने init.hardware.rc
:
# We need vold early for metadata encryption on early-fs start vold
Keymaster चल रहा है और माउंट करने के लिए init प्रयास से पहले तैयार किया जाना चाहिए /data
।
init.hardware.rc
पहले से ही एक को शामिल करना चाहिए mount_all
अनुदेश जो माउंट /data
में ही on late-fs
छंद। इस लाइन से पहले, निर्देश exec में जोड़ने wait_for_keymaster
सेवा:
on late-fs … # Wait for keymaster exec_start wait_for_keymaster # Mount RW partitions which need run fsck mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late
मेटाडेटा एन्क्रिप्शन चालू करना
अंत में जोड़ने keydirectory=/metadata/vold/metadata_encryption
की fs_mgr_flags स्तंभ के लिए fstab
के लिए प्रवेश userdata
। उदाहरण के लिए, एक पूर्ण fstab लाइन इस तरह दिख सकती है:
/dev/block/bootdevice/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,inlinecrypt latemount,wait,check,fileencryption=aes-256-xts:aes-256-cts:inlinecrypt_optimized,keydirectory=/metadata/vold/metadata_encryption,quota,formattable
डिफ़ॉल्ट रूप से, आंतरिक संग्रहण पर मेटाडेटा एन्क्रिप्शन एल्गोरिथम AES-256-XTS है। इस सेटिंग के द्वारा अधिरोहित जा सकता है metadata_encryption
fs_mgr_flags कॉलम में विकल्प, भी:
- उपकरणों कि एईएस त्वरण की कमी पर, Adiantum एन्क्रिप्शन सेटिंग के द्वारा सक्षम किया जा सकता
metadata_encryption=adiantum
। - उपकरणों कि समर्थन पर हार्डवेयर-लिपटे चाबियाँ , मेटाडाटा एन्क्रिप्शन कुंजी बनाया जा सकता है हार्डवेयर-लिपटे स्थापना करके
metadata_encryption=aes-256-xts:wrappedkey_v0
(या समतुल्य रूपmetadata_encryption=:wrappedkey_v0
, के रूप मेंaes-256-xts
डिफ़ॉल्ट एल्गोरिथ्म है)।
क्योंकि करने के लिए कर्नेल इंटरफेस dm-default-key
एंड्रॉयड 11 में बदल गया है, आप यह भी सुनिश्चित करने के लिए आप के लिए सही मान निर्धारित किया है कि जरूरत PRODUCT_SHIPPING_API_LEVEL
में device.mk
। उदाहरण के लिए, अगर एंड्रॉयड 11 (एपीआई स्तर 30) के साथ अपनी डिवाइस लॉन्च हुआ, जिसने device.mk
शामिल करना चाहिए:
PRODUCT_SHIPPING_API_LEVEL := 30
तुम भी नए का उपयोग कराने के लिए निम्न सिस्टम गुण सेट कर सकते हैं dm-default-key
एपीआई स्तर शिपिंग की परवाह किए बिना एपीआई:
PRODUCT_PROPERTY_OVERRIDES += \ ro.crypto.dm_default_key.options_format.version=2
मान्यकरण
यह सत्यापित करने के लिए कि मेटाडेटा एन्क्रिप्शन सक्षम है और ठीक से काम कर रहा है, नीचे वर्णित परीक्षण चलाएँ। इसके अलावा में सचेत रहें कि आम मुद्दों नीचे वर्णित है।
परीक्षण
यह सत्यापित करने के लिए कि आंतरिक संग्रहण पर मेटाडेटा एन्क्रिप्शन सक्षम है, निम्न आदेश चलाकर प्रारंभ करें:
adb root
adb shell dmctl table userdata
आउटपुट के समान होना चाहिए:
Targets in the device-mapper table for userdata: 0-4194304: default-key, aes-xts-plain64 - 0 252:2 0 3 allow_discards sector_size:4096 iv_large_sectors
आप की स्थापना करके डिफ़ॉल्ट एन्क्रिप्शन सेटिंग overrode तो metadata_encryption
डिवाइस की में विकल्प fstab
, तो उत्पादन ऊपर से थोड़ा भिन्न होते हैं जाएगा। उदाहरण के लिए, यदि आप सक्षम Adiantum एन्क्रिप्शन , फिर तीसरे क्षेत्र हो जाएगा xchacha12,aes-adiantum-plain64
बजाय aes-xts-plain64
।
इसके बाद, चलाने vts_kernel_encryption_test मेटाडाटा एन्क्रिप्शन और FBE की सत्यता की पुष्टि करने के लिए:
atest vts_kernel_encryption_test
या:
vts-tradefed run vts -m vts_kernel_encryption_test
सामान्य मुद्दे
कॉल करने के लिए के दौरान mount_all
, जो मेटाडाटा-एन्क्रिप्टेड mounts /data
विभाजन, init
ग्राम रक्षा समिति के उपकरण निष्पादित करता है। ग्राम रक्षा समिति के उपकरण जोड़ता को vold
से अधिक binder
मेटाडाटा-एन्क्रिप्टेड डिवाइस को सेट और विभाजन माउंट करने के लिए। इस कॉल की अवधि के लिए, init
अवरुद्ध है, और या तो पढ़ने या सेट करने का प्रयास init
गुण जब तक अवरुद्ध कर देगा mount_all
खत्म। तो, इस स्तर पर, के किसी भी हिस्से vold
का कार्यालय प्रत्यक्ष या परोक्ष रूप पढ़ने या एक संपत्ति की स्थापना पर अवरुद्ध है, गतिरोध परिणाम देगा। ऐसा नहीं है कि यह सुनिश्चित करने के लिए महत्वपूर्ण है vold
के साथ आगे बातचीत के बिना, कुंजी पढ़ने Keymaster के साथ बातचीत, और डेटा निर्देशिका बढ़ते काम को पूरा कर सकते हैं init
।
यदि Keymaster पूरी तरह से शुरू नहीं किया जाता है, जब mount_all
चलता है, यह का जवाब देंगे नहीं vold
जब तक यह से कुछ गुण पढ़ा है init
, वास्तव में गतिरोध में जिसके परिणामस्वरूप का वर्णन किया। रखने exec_start wait_for_keymaster
प्रासंगिक ऊपर mount_all
के रूप में सुनिश्चित निकल पड़े मंगलाचरण कि Keymaster पूरी तरह से अग्रिम में चल रहा है और इसलिए है इस गतिरोध से बचा जाता है।
गोद लेने योग्य भंडारण पर विन्यास
एंड्रॉयड 9 के बाद से, मेटाडाटा एन्क्रिप्शन का एक रूप हमेशा पर सक्षम है ग्रहणीय भंडारण जब भी FBE सक्षम किया गया है, तब भी जब मेटाडाटा एन्क्रिप्शन आंतरिक मेमोरी में सक्षम नहीं है।
AOSP में, वहाँ ग्रहणीय भंडारण पर मेटाडाटा एन्क्रिप्शन के दो कार्यान्वयन हैं: एक पदावनत के आधार पर एक dm-crypt
, और एक नए आधार पर dm-default-key
। यह सुनिश्चित करने के सही क्रियान्वयन के लिए अपनी डिवाइस के लिए चुना जाता है, सुनिश्चित करें कि आप के लिए सही मान निर्धारित किया है कि PRODUCT_SHIPPING_API_LEVEL
में device.mk
। उदाहरण के लिए, अगर एंड्रॉयड 11 (एपीआई स्तर 30) के साथ अपनी डिवाइस लॉन्च हुआ, जिसने device.mk
शामिल करना चाहिए:
PRODUCT_SHIPPING_API_LEVEL := 30
आप शिपिंग API स्तर की परवाह किए बिना नई वॉल्यूम मेटाडेटा एन्क्रिप्शन विधि (और नया डिफ़ॉल्ट FBE नीति संस्करण) के उपयोग के लिए बाध्य करने के लिए निम्न सिस्टम गुण भी सेट कर सकते हैं:
PRODUCT_PROPERTY_OVERRIDES += \ ro.crypto.volume.metadata.method=dm-default-key \ ro.crypto.dm_default_key.options_format.version=2 \ ro.crypto.volume.options=::v2
वर्तमान विधि
एंड्रॉयड 11 या उसके बाद के साथ शुरू करने डिवाइस पर, ग्रहणीय भंडारण पर मेटाडाटा एन्क्रिप्शन का उपयोग करता dm-default-key
सिर्फ मोबाइल संग्रहण की तरह, कर्नेल मॉड्यूल। देखें आवश्यक शर्तें जिसके लिए कर्नेल विन्यास विकल्प सक्षम करने के लिए ऊपर। ध्यान दें कि इनलाइन एन्क्रिप्शन हार्डवेयर डिवाइस की आंतरिक मेमोरी पर काम करता है ग्रहणीय भंडारण पर उपलब्ध नहीं है और इस तरह हो सकता है कि CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK=y
आवश्यकता हो सकती है।
डिफ़ॉल्ट रूप से, dm-default-key
मात्रा मेटाडाटा एन्क्रिप्शन विधि 4096-बाइट क्रिप्टो क्षेत्रों के साथ एईएस 256 XTS एन्क्रिप्शन एल्गोरिथ्म का उपयोग करता। एल्गोरिथ्म की स्थापना द्वारा अधिरोहित जा सकता है ro.crypto.volume.metadata.encryption
प्रणाली संपत्ति। यह संपत्ति के मूल्य के रूप में ही वाक्य रचना है metadata_encryption
fstab ऊपर वर्णित विकल्प। उदाहरण के लिए, उपकरणों कि एईएस त्वरण की कमी पर, Adiantum एन्क्रिप्शन सेटिंग के द्वारा सक्षम किया जा सकता ro.crypto.volume.metadata.encryption=adiantum
।
विरासत विधि
एंड्रॉयड 10 या कम के साथ शुरू करने डिवाइस पर, ग्रहणीय भंडारण पर मेटाडाटा एन्क्रिप्शन का उपयोग करता dm-crypt
के बजाय गिरी मॉड्यूल dm-default-key
:
CONFIG_DM_CRYPT=y
विपरीत dm-default-key
विधि, dm-crypt
विधि फ़ाइल सामग्री दो बार एन्क्रिप्ट होने के लिए कारण बनता है: एक FBE कुंजी के साथ एक बार और मेटाडाटा एन्क्रिप्शन कुंजी के साथ एक बार। यह दोहरा एन्क्रिप्शन प्रदर्शन को कम करता है और मेटाडेटा एन्क्रिप्शन के सुरक्षा लक्ष्यों को प्राप्त करने के लिए आवश्यक नहीं है, क्योंकि Android सुनिश्चित करता है कि FBE कुंजी मेटाडेटा एन्क्रिप्शन कुंजी के रूप में समझौता करने के लिए कम से कम कठिन हैं। विक्रेताओं को लागू करने से डबल एन्क्रिप्शन से बचने के लिए, विशेष रूप से गिरी अनुकूलन कर सकते हैं allow_encrypt_override
विकल्प जो एंड्रॉयड के लिए पारित करेंगे dm-crypt
जब सिस्टम संपत्ति ro.crypto.allow_encrypt_override
पर सेट है true
। ये अनुकूलन Android सामान्य कर्नेल द्वारा समर्थित नहीं हैं।
डिफ़ॉल्ट रूप से, dm-crypt
मात्रा मेटाडाटा एन्क्रिप्शन विधि ESSIV और 512-बाइट क्रिप्टो क्षेत्रों के साथ एईएस 128-सीबीसी एन्क्रिप्शन एल्गोरिथ्म का उपयोग करता। इसे निम्नलिखित सिस्टम गुण (जो FDE के लिए भी उपयोग किया जाता है) सेट करके ओवरराइड किया जा सकता है:
-
ro.crypto.fde_algorithm
मेटाडाटा एन्क्रिप्शन एल्गोरिथ्म चयन करता है। विकल्प हैंaes-128-cbc
औरadiantum
। Adiantum केवल इस्तेमाल किया जा सकता है, तो डिवाइस एईएस त्वरण का अभाव है। -
ro.crypto.fde_sector_size
चयन क्रिप्टो क्षेत्र आकार। विकल्प ५१२, १०२४, २०४८, और ४०९६ हैं। एडियंटम एन्क्रिप्शन के लिए, ४०९६ का उपयोग करें।