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