मैं यहाँ Android मैनुअल से उद्धृत कर रहा हूँ , लेकिन:
ध्यान दें:
मैंने जो स्रोत उपयोग किया है, वह सीधे मार्शमैलो के लिए प्रासंगिक नहीं है, बल्कि लॉलीपॉप और उच्चतर के लिए प्रासंगिक है।
टी एल: डॉ
मैं अभी ओपी के सवालों का जवाब दूंगा। तकनीकी विवरण का पालन करेंगे।
डिफ़ॉल्ट एन्क्रिप्शन कुंजी एक हार्डवेयर स्रोत (एक टीपीएम के समान चिप) और एओएसपी के डिफ़ॉल्ट पासवर्ड default_passwordको cryptfs.cस्रोत फ़ाइल के रूप में परिभाषित किया गया है , नीचे देखें।
हां, न केवल डिफ़ॉल्ट, बल्कि किसी भी पासवर्ड को एक कुंजी में बनाया जाता है और टीपीएम जैसी चिप पर संग्रहीत किया जाता है, जिसे टीईई कहा जाता है ("विश्वसनीय निष्पादन पर्यावरण के लिए संक्षिप्त", आगे के विवरण के लिए नीचे देखें)।
डिवाइस के SoC पर चिप्स के लिए UART / JTAG के साथ एक हैकर तकनीकी रूप से TEE कुंजी तक पहुंच प्राप्त कर सकता है, या एक कस्टम कर्नेल इस जानकारी को हैकर को लीक कर सकता है। साजिश के सिद्धांतों में कुछ 3-अक्षर एजेंसियां संभवतः उत्पादन उपकरणों में इस्तेमाल होने वाली इन असुरक्षित गुठली प्राप्त करने के लिए ओईएम के साथ साझेदारी कर सकती हैं, लेकिन मैं इसके द्वारा कई स्टोर नहीं करूंगा। फिर, आगे के विवरण के लिए इस उत्तर के अंतिम भाग को देखें।
हैकर को कुंजी तक पहुंचने से रोकने वाली एकमात्र चीज ऐसा करने के लिए आवश्यक प्रयास की सरासर राशि है।
- ( Google द्वारा "सत्यापित बूट" कहा जाता है) फर्मवेयर (चेकसमिंग) के हैश की जाँच करना वास्तव में लॉलीपॉप के ऊपर और ऊपर डिफ़ॉल्ट रूप से किया जाता है (और जेलीबीन 4.3 आगे से उपलब्ध है), जिसे कर्नेल मॉड्यूल कहा जाता है
dm-verity। हालाँकि, यह एन्क्रिप्शन की स्थिति से स्वतंत्र है।
स्रोत: AOSP सुरक्षा गाइड यहाँ ।
- कस्टम पासवर्ड के साथ सिस्टम को डिक्रिप्ट करने में शामिल प्रक्रिया के बारे में, नीचे देखें। मैं आपको यहां केवल यह बताऊंगा कि उपयोगकर्ता पासवर्ड एन्क्रिप्शन कुंजी के निर्माण और उपयोग दोनों में शामिल है।
अवलोकन
पहले बूट पर, डिवाइस एक यादृच्छिक रूप से उत्पन्न 128-बिट मास्टर कुंजी बनाता है और फिर इसे डिफ़ॉल्ट पासवर्ड और संग्रहीत नमक के साथ हैश करता है। डिफ़ॉल्ट पासवर्ड है: "default_password" हालांकि, परिणामी हैश पर TEE (जैसे ट्रस्टज़ोन) के माध्यम से भी हस्ताक्षर किए जाते हैं, जो मास्टर कुंजी को एन्क्रिप्ट करने के लिए हस्ताक्षर के हैश का उपयोग करता है।
आप Android Open Source Project cryptfs.c फ़ाइल में परिभाषित डिफ़ॉल्ट पासवर्ड पा सकते हैं ।
जब उपयोगकर्ता डिवाइस पर पिन / पास या पासवर्ड सेट करता है, तो केवल 128-बिट कुंजी फिर से एन्क्रिप्ट की जाती है और संग्रहीत की जाती है। (अर्थात। यूजर पिन / पास / पैटर्न परिवर्तन उपयोगकर्ताडेटा विभाजन के पुनः एन्क्रिप्शन का कारण नहीं बनते हैं।)
डिफ़ॉल्ट एन्क्रिप्शन के साथ एक एन्क्रिप्टेड डिवाइस शुरू करना
ऐसा तब होता है जब आप एक एन्क्रिप्टेड डिवाइस को बिना पासवर्ड के बूट करते हैं। क्योंकि एंड्रॉइड 5.0 डिवाइस पहले बूट पर एन्क्रिप्टेड हैं, कोई सेट पासवर्ड नहीं होना चाहिए और इसलिए यह डिफ़ॉल्ट एन्क्रिप्शन स्थिति है।
- बिना पासवर्ड के एन्क्रिप्टेड / डेटा का पता लगाएं
पता लगाएँ कि एंड्रॉइड डिवाइस एन्क्रिप्ट किया गया है क्योंकि / डेटा को माउंट नहीं किया जा सकता है और एक झंडे encryptableया forceencryptसेट किया गया है।
voldसेट vold.decryptकरने के लिए trigger_default_encryptionहै, जो शुरू होता है defaultcryptoसेवा। trigger_default_encryptionएन्क्रिप्शन प्रकार की जाँच करता है यह देखने के लिए कि क्या / पासवर्ड पासवर्ड के साथ या बिना एन्क्रिप्ट किया गया है।
- डिक्रिप्ट / डेटा
dm-cryptडिवाइस को ब्लॉक डिवाइस पर बनाता है इसलिए डिवाइस उपयोग के लिए तैयार है।
- पर्वत / डेटा
voldफिर डिक्रिप्टेड वास्तविक / डेटा विभाजन को mounts और फिर नए विभाजन को तैयार करता है। यह संपत्ति सेट करता 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और बूट के बाद पहली बार क्लास लेट_स्टार्ट में भी सेवाएं शुरू करता है।
- ढांचा शुरू करो
अब रूपरेखा डिक्रिप्टेड / डेटा का उपयोग करके अपनी सभी सेवाओं को बूट करती है, और सिस्टम उपयोग के लिए तैयार है।
डिफ़ॉल्ट एन्क्रिप्शन के बिना एक एन्क्रिप्टेड डिवाइस शुरू करना
ऐसा तब होता है जब आप एक एन्क्रिप्टेड डिवाइस को बूट करते हैं जिसमें एक सेट पासवर्ड होता है। डिवाइस का पासवर्ड पिन, पैटर्न या पासवर्ड हो सकता है।
- एक पासवर्ड के साथ एन्क्रिप्टेड डिवाइस का पता लगाएं
पता लगाएँ कि ध्वज के कारण Android डिवाइस एन्क्रिप्ट किया गया है ro.crypto.state = "encrypted"
voldपासवर्ड के साथ / डेटा एन्क्रिप्ट vold.decryptहोने के trigger_restart_min_frameworkकारण सेट होता है।
- माउंट tmpfs
initके लिए दिए गए मापदंडों के साथ / डेटा के लिए दिए गए शुरुआती माउंट विकल्पों को बचाने के लिए पांच गुण सेट करता है init.rc। voldक्रिप्टो मैपिंग सेट करने के लिए इन गुणों का उपयोग करता है:
ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags (0 अंक से पहले ASCII 8 अंकों की हेक्स संख्या)
- पासवर्ड के लिए संकेत करने के लिए रूपरेखा प्रारंभ करें
फ्रेमवर्क शुरू होता है और देखता है कि किस vold.decryptपर सेट किया गया है trigger_restart_min_framework। यह फ्रेमवर्क को बताता है कि यह एक tmpfs /dataडिस्क पर बूट हो रहा है और इसे उपयोगकर्ता का पासवर्ड प्राप्त करने की आवश्यकता है।
सबसे पहले, हालांकि, यह सुनिश्चित करने की आवश्यकता है कि डिस्क ठीक से एन्क्रिप्ट किया गया था। यह cryptfs cryptocompleteकरने के लिए आदेश भेजता है vold। voldरिटर्न 0 यदि एन्क्रिप्शन सफलतापूर्वक पूरा हो गया था, -1 आंतरिक त्रुटि पर, या -2 यदि एन्क्रिप्शन सफलतापूर्वक पूरा नहीं हुआ था। ध्वज के voldलिए क्रिप्टो मेटाडेटा में देखकर यह निर्धारित करता है CRYPTO_ENCRYPTION_IN_PROGRESS। यदि यह सेट है, तो एन्क्रिप्शन प्रक्रिया बाधित हो गई थी, और डिवाइस पर कोई उपयोग करने योग्य डेटा नहीं है।
यदि voldकोई त्रुटि देता है, तो UI को उपयोगकर्ता को डिवाइस को रिबूट और फ़ैक्टरी-रीसेट करने के लिए एक संदेश प्रदर्शित करना चाहिए, और उपयोगकर्ता को ऐसा करने के लिए एक बटन दबाने के लिए देना चाहिए।
- पासवर्ड के साथ डेटा डिक्रिप्ट करें
एक बार cryptfs cryptocompleteसफल होने के बाद, फ्रेम डिस्क के लिए पूछते हुए यूआई प्रदर्शित करता है। UI कमांड भेजकर पासवर्ड की जांच करता cryptfs 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। यह mainकक्षा में सभी सेवाओं को रोक देता है, जो कि tmpfs /dataअनमाउंट होने की अनुमति देता है ।
- पर्वत / डेटा
voldतब डिक्रिप्ट किए गए वास्तविक /dataविभाजन की गणना करता है और नए विभाजन को तैयार करता है (जो कभी तैयार नहीं किया गया होता यदि इसे पोंछे विकल्प के साथ एन्क्रिप्ट किया गया था, जो पहले रिलीज में समर्थित नहीं है)। यह संपत्ति सेट करता vold.post_fs_data_doneहै 0और फिर सेट करता vold.decryptहै trigger_post_fs_data। यह init.rcइसके चलाने का कारण बनता है post-fs-data commands। वे कोई आवश्यक निर्देशिका या लिंक बनाएंगे और फिर सेट vold.post_fs_data_doneकरेंगे 1। एक बार जब voldदेखता है 1कि संपत्ति में, यह संपत्ति सेट vold.decryptकरने के लिए trigger_restart_framework। यह फिर से init.rcकक्षा में सेवाएं शुरू करने mainऔर late_startबूट के बाद पहली बार कक्षा में सेवाएं शुरू करने का कारण बनता है ।
- पूर्ण रूपरेखा शुरू करें
अब रूपरेखा डिक्रिप्टेड / डेटा फाइलसिस्टम का उपयोग करके अपनी सभी सेवाओं को बूट करती है, और सिस्टम उपयोग के लिए तैयार है।
एन्क्रिप्ट की गई कुंजी को संग्रहीत करना
एन्क्रिप्टेड कुंजी को क्रिप्टो मेटाडेटा में संग्रहीत किया जाता है। हार्डवेयर बैकिंग विश्वसनीय निष्पादन पर्यावरण (TEE) पर हस्ताक्षर करने की क्षमता का उपयोग करके कार्यान्वित किया जाता है। पहले, हमने scryptउपयोगकर्ता की पासवर्ड और संग्रहीत नमक पर लागू होने से उत्पन्न कुंजी के साथ मास्टर कुंजी को एन्क्रिप्ट किया था ।
ऑफ-बॉक्स हमलों के खिलाफ कुंजी को लचीला बनाने के लिए, हम संग्रहीत एल्गोरिथ्म को संग्रहीत टीईई कुंजी के साथ हस्ताक्षर करके इस एल्गोरिथ्म का विस्तार करते हैं। परिणामी हस्ताक्षर को एक और अधिक आवेदन द्वारा उपयुक्त लंबाई की कुंजी में बदल दिया जाता है scrypt। यह कुंजी तब मास्टर कुंजी को एन्क्रिप्ट और डिक्रिप्ट करने के लिए उपयोग की जाती है। इस कुंजी को संग्रहीत करने के लिए:
- यादृच्छिक 16-बाइट डिस्क एन्क्रिप्शन कुंजी (DEK) और 16-बाइट नमक उत्पन्न करें।
scrypt32-बाइट मध्यवर्ती कुंजी 1 (IK1) का उत्पादन करने के लिए उपयोगकर्ता पासवर्ड और नमक पर लागू करें ।
- पैड IK1 हार्डवेयर बाउंड प्राइवेट कुंजी (HBK) के आकार को शून्य बाइट्स के साथ। विशेष रूप से, हम पैड के रूप में: 00 || IK1 || 00..00; एक शून्य बाइट, 32 IK1 बाइट, 223 शून्य बाइट।
- HBK के साथ 2561 बाइट IK2 बनाने के लिए IK1 पर हस्ताक्षर करें।
- लागू करें
scryptIK2 और नमक (चरण 2 के रूप में ही नमक) के 32-बाइट IK3 निर्माण करने के लिए।
- IK3 के पहले 16 बाइट्स को KEK के रूप में और अंतिम 16 बाइट्स को IV के रूप में उपयोग करें।
- AES_CBC के साथ DEK को एन्क्रिप्ट करें, कुंजी KEK के साथ, और आरंभीकरण वेक्टर IV।