एक एम्बेडेड डिवाइस की मेमोरी में एक सुरक्षित कुंजी संग्रहीत करना


10

मैं एक एम्बेडेड डिवाइस पर काम कर रहा हूं जो डेटा भेजता / प्राप्त करता है और उन्हें सिफरटेक्स्ट मोड (एन्क्रिप्टेड मोड) में संग्रहीत करता है। अब स्टोरिंग कीज़ के लिए सबसे अच्छा तरीका क्या है (मैंने ARM CORTEX M सीरीज MCU का उपयोग किया है)?

SRAM मेमोरी में 1-स्टोरिंग कीज़ और प्रत्येक बूटिंग सीक्वेंस में, एम्बेडेड MCU कीज़ को इंजेक्ट करें और उन्हें SRAM मेमोरी में स्टोर करें। यह मेरे हिसाब से सबसे अच्छा तरीका है, तब जब MCU सेंस पैनिक (टैम्पर सेंसर या ... के साथ) यह SRAM को जल्दी से मिटा सकता है और खुद को रीसेट कर सकता है। नुकसान: अगर टैंपर को पास करने और डिवाइस तक पहुंच के लिए हमलावर की सफलता, SRAM मेमोरी (कोड खनन के खिलाफ) कितनी सुरक्षित है। मुझे MCUs में इस मेमोरी की कोई सुरक्षा क्षमता नहीं मिल रही है।

2-जनरेट कीज और उन्हें प्रोग्रामिंग MCU में फ्लैश मेमोरी में स्टोर किया। MCU फ़्लैश मेमोरी का सपोर्ट CRP (कोड रीड प्रोटेक्शन) जो कोड माइनिंग से रोकता है और इसके आंतरिक AES इंजन और RNG (रैंडम नंबर जेनरेशन) इंजन की सहायता से हम एक यादृच्छिक कुंजी और फ़्लैश मेमोरी को एन्क्रिप्ट कर सकते हैं और उस यादृच्छिक कुंजी को OTP में संग्रहीत कर सकते हैं ( एक बार प्रोग्राम करने योग्य मेमोरी -एक 128 बिट एन्क्रिप्टेड मेमोरी), फिर कोड निष्पादन में हम आरएनजी कुंजी और प्रारंभिक कुंजी और कोड तक पहुंच के साथ फ्लैश मेमोरी को डिकोड करते हैं। नुकसान: एक गैर वाष्पशील मेमोरी में संग्रहीत कीज़, टैंपर बेकार हो जाएंगे और हमलावर के पास मेरी कुंजियों के लिए बहुत समय होगा।

EEPROM मेमोरी में 3-संग्रहीत कुंजी, 2 उपरोक्त दृष्टिकोण का संयोजन, गैर-वाष्पशील मेमोरी में संग्रहीत कुंजी लेकिन जब टैम्पर्स की समझ पैठ EEPROM को मिटाने योग्य है।

मैं LPC18S57FBD208 (1MB फ्लैश मेमोरी, 180MHZ, 136KB SRAM, 16KB EEPROM और एक TFT LCD कंट्रोलर के साथ कोर्टेक्स m3 पर विचार करता हूं, जिसके लिए मुझे 7 "TFT LCD और AES 128 बिट क्रिप्टो इंजन) चलाने की आवश्यकता है, क्या कोई और बेहतर सुझाव है?

जवाबों:


18

उन विकल्पों में से कोई भी विशेष रूप से दूसरों की तुलना में बेहतर या बदतर नहीं है, क्योंकि वे सभी बहुत असुरक्षित हैं। मैं विकल्प 4 के साथ जा रहा हूं।

  1. SRAM कुंजियों को संग्रहीत करने के लिए सबसे सुरक्षित स्थान है, लेकिन आपको उन्हें बाहरी दुनिया से कभी भी इंजेक्ट नहीं करना चाहिए। उन्हें हमेशा बूट के दौरान, प्रोसेसर के भीतर उत्पन्न होना चाहिए। बाकी कुछ भी करना तुरंत बाकी को अमान्य कर देता है - यह स्वचालित रूप से असुरक्षित है।

  2. नॉनवेज मेमोरी में कीज़ को स्टोर न करें, आप इस पर सही हैं। इससे कोई फर्क नहीं पड़ता कि आप EEPROM या फ्लैश मेमोरी को पढ़ने से बचाते हैं। वह कोड रीड प्रोटेक्शन फ्यूज आसानी से उलट जाता है। एक हमलावर को केवल डिकैप (हटाने या रासायनिक रूप से ब्लैक एपॉक्सी पैकेजिंग को हटाने के लिए सिलिकॉन डाई के अंदर बाहर निकालने की आवश्यकता होती है)। इस बिंदु पर, वे मरने के उस हिस्से को कवर कर सकते हैं जो गैर-वाष्पशील मेमोरी सेल है (ये सेक्शन बहुत नियमित हैं और जबकि व्यक्तिगत मेमोरी सेल देखने के लिए बहुत छोटी हैं, बड़ी संरचना हो सकती है) और किसी चीज़ का छोटा टुकड़ा यूवी से अपारदर्शी उस खंड पर नकाबपोश है। फिर हमलावर 5-10 मिनट के लिए चिप पर एक यूवी प्रकाश चमक सकता है, और सीआरपी फ्यूज सहित सभी फ़्यूज़ को रीसेट कर सकता है। OTP मेमोरी को अब किसी भी मानक प्रोग्रामर द्वारा पढ़ा जा सकता है।

या, यदि वे अच्छी तरह से वित्त पोषित हैं (कहते हैं, उन कुंजियों का मूल्य किसी के लिए $ 1000 से अधिक है), तो वे कई प्रकार के इलेक्ट्रॉन माइक्रोस्कोपों ​​के साथ सीधे मेमोरी कोशिकाओं को पढ़ सकते हैं।

सुरक्षित होने के लिए, चाबियाँ मिटनी चाहिए, छिपी नहीं।

  1. नहीं, उपरोक्त कारणों से।

अब, विकल्प 4 पर:

  1. बस एन्क्रिप्शन का उपयोग करें। कुंजी वितरण एक हल की गई समस्या है। तो उस आसानी से उपलब्ध समाधान का उपयोग करें। चिप को अपने आरएनजी का उपयोग करना चाहिए और यह सुनिश्चित करने के लिए कि उसे एन्ट्रापी की पर्याप्त आपूर्ति उपलब्ध है, और बूट लोडर को सीधे उस प्रोग्राम में बूट करना चाहिए जो आवश्यक गुप्त कुंजी (ओं) को उत्पन्न करता है, जो सामान्य प्रयोजन में होना चाहिए रजिस्टर और SRAM में सीधे चले गए, जहां वे मिटाए जाने तक रहेंगे।

हालाँकि एक समस्या है, जो यह है कि सीपीयू के अलावा कुछ भी पता नहीं है कि गुप्त कुंजी क्या है। कोई समस्या नहीं: सार्वजनिक कुंजी क्रिप्टोग्राफी का उपयोग करें। आपने ओटीपी मेमोरी में जो भी स्टोर किया है वह आपकी सार्वजनिक कुंजी है। इस कुंजी को किसी के द्वारा पढ़ा जा सकता है, आप इसे स्टैक एक्सचेंज पर पोस्ट कर सकते हैं, आप इसे 5 फुट ऊंचे अक्षरों में एक तेल टैंकर की तरफ से पेंट कर सकते हैं, इससे कोई फर्क नहीं पड़ता। सार्वजनिक कुंजी क्रिप्टोग्राफी के बारे में आश्चर्यजनक बात यह है कि यह असममित है। कुछ को एन्क्रिप्ट करने की कुंजी इसे डिक्रिप्ट नहीं कर सकती है, जिसके लिए निजी कुंजी की आवश्यकता होती है। और इसके विपरीत, सार्वजनिक कुंजी द्वारा एन्क्रिप्ट किए गए कुछ को डिक्रिप्ट करने की कुंजी का उपयोग कुछ एन्क्रिप्ट करने के लिए नहीं किया जा सकता है। इसलिए, CPU गुप्त कुंजी उत्पन्न करता है, गुप्त कुंजी की जांच के लिए अपनी संग्रहीत सार्वजनिक कुंजी का उपयोग करता है, और बस इसे USB या RS232 या जो भी आप चाहते हैं, उस पर भेजता है। गुप्त कुंजी को पढ़ने के लिए आपकी निजी कुंजी की आवश्यकता होती है, जिसे चिप के साथ संग्रहीत, भेजा या कभी भी शामिल नहीं किया जाना चाहिए। एक बार जब आपके पास अपनी निजी कुंजी (चिप के बाहर कहीं और) के साथ गुप्त कुंजी डिक्रिप्ट हो जाती है, तो आप सेट हो जाते हैं। आपके पास एक सुरक्षित रूप से प्रसारित गुप्त कुंजी है जो पूरी तरह से चिप के भीतर उत्पन्न हुई थी, बिना किसी सार्वजनिक कुंजी को छोड़कर कुछ भी संग्रहीत करने के लिए - जो पहले कहा गया था, को पढ़ने से बिल्कुल भी संरक्षित नहीं होना चाहिए।

इस प्रक्रिया को औपचारिक रूप से महत्वपूर्ण बातचीत कहा जाता है, और हर चीज इसका उपयोग करती है। आपने आज कई बार इसका उपयोग किया है। इसे संभालने के लिए कई संसाधन और पुस्तकालय उपलब्ध हैं। कृपया, कभी भी किसी भी चीज़ में 'इंजेक्ट' कीज़ न करें।

एक अंतिम बात का उल्लेख करें: यह सब लूट है क्योंकि एईएस कुंजी को साइड चैनल हमलों का उपयोग करके आसानी से पुनर्प्राप्त किया जा सकता है, जो बिजली की आपूर्ति पर बैठते हैं और वर्तमान ड्रा में मिनट परिवर्तन और सीपीयू में फ़्लिपिंग बिट्स के कारण उन परिवर्तनों के बीच के समय को मापते हैं। रजिस्टर के रूप में। यह, एईएस (या जो संभव एन्क्रिप्शन एल्गोरिदम के बहुत छोटे सेट में से एक का उपयोग किया जा सकता है) के ज्ञान के साथ संयुक्त काम करता है, यह कुंजी को पुनर्प्राप्त करने के लिए अपेक्षाकृत आसान और सस्ता बनाता है। यह कुंजी को पढ़ने की अनुमति नहीं देगा, लेकिन यह महत्वपूर्ण स्थान को हास्यास्पद रूप से छोटा कर सकता है, जैसे 255 संभव कुंजियाँ। चिप भी इसका पता नहीं लगा सकती, क्योंकि यह ऊपर की तरफ है।

इससे AES-256 एन्क्रिप्टेड बूट लोडर को 'सुरक्षित' क्रिप्टो प्रोसेसर पर हराया गया है और यह इतना कठिन भी नहीं है। जहां तक ​​मुझे पता है, इस हमले के लिए कोई सच्चे हार्डवेयर काउंटर उपाय नहीं हैं। हालांकि, यह स्वयं एन्क्रिप्शन एल्गोरिदम है, और कैसे उन्हें बिट्स को फ्लिप करने के लिए सीपीयू की आवश्यकता होती है, जो इस भेद्यता का कारण बन रहा है। मुझे संदेह है कि साइड-चैनल प्रतिरोधी या साइड-चैनल प्रूफ एल्गोरिदम को विकसित किया जाना चाहिए (और उम्मीद है)।

तो जैसा कि यह अभी खड़ा है, एक एम्बेडेड डिवाइस पर कुंजी (या यहां तक ​​कि सिर्फ एक अस्थायी कुंजी का उपयोग करने के लिए) का असली जवाब सुरक्षित रूप से है: आप नहीं कर सकते।

लेकिन कम से कम यदि आप विकल्प 4 में महत्वपूर्ण बातचीत का उपयोग करके हर बार एक नई कुंजी उत्पन्न करते हैं, तो एक साइड चैनल हमला केवल एक इन-उपयोग चैनल की कुंजी से समझौता कर सकता है, और केवल तभी जब उनके पास डेटा की निगरानी करने के लिए थोड़ी देर हो। । यदि आप आंतरिक रूप से उत्पन्न नई चाबियों पर अक्सर बातचीत करते हैं, तो यह सुरक्षा की उपयोगी मात्रा को वहन कर सकता है।

कुंजियाँ बनाएँ, और उन्हें यथासंभव कम समय के लिए संग्रहीत करें।


मुझे धन्यवाद देने के लिए वास्तव में धन्यवाद प्रिय मेटाकोलिन। लेकिन मेरी परियोजना में कई पाठक शामिल हैं (एमसीयू शामिल हैं) और कई लक्ष्य MCUs हैं, प्रत्येक पाठक को किसी भी लक्ष्य को पढ़ने में सक्षम होना चाहिए और किसी भी लक्ष्य को पाठकों द्वारा पढ़ने में सक्षम होना चाहिए। मुझे लगता है कि उन्हें डेटा ट्रांसपोर्ट करने के लिए एक अद्वितीय कुंजी के साथ सहमत होना चाहिए। और आपके उत्तर के आधार पर मुझे लगता है कि उदाहरण के लिए LPC18S57 सुरक्षित कोर्टेक्स एम 3 और STM32F429 जनरल कॉर्टेक्स एम 4 और यहां तक ​​कि एलपीसी 1788 जनरल कॉर्टेक्स एम 3 (सस्ती पसंद) के बीच बहुत अंतर नहीं हैं, मैं शीर्ष गुप्त परियोजना कर रहा हूं लेकिन मैं करना चाहता हूं यह जितना हो सके उतना सुरक्षित है।
महमूद होसेनीपोर

2
आपका कथन कि "एईएस कुंजी को आसानी से पुनर्प्राप्त किया जा सकता है" कम से कम संदिग्ध है। मैं यह पता लगाने की तकनीक के पीछे सिद्धांत को समझता हूं कि प्रोसेसर में क्या होता है, इसकी वर्तमान खपत के आधार पर। हालांकि, यह मानता है कि एन्क्रिप्शन और डिक्रिप्शन केवल एक चीज है जिस पर सीपीयू काम कर रहा है। हालांकि, अधिकांश अनुप्रयोगों में केवल 1 सीपीयू होता है जो एक ही समय में कार्यों के एक गुच्छा पर काम करता है। एक ब्लॉक के दौरान एईएस एन्क्रिप्शन दसियों या सैकड़ों व्यवधान हो सकते हैं जो वर्तमान चोटियों के आधार पर कुंजी का पता लगाना असंभव बनाता है।
bakcsa83

2
यदि कुंजी को फ्लैश में संग्रहीत नहीं किया जाना चाहिए, तो कुंजी कोड बनाने वाले कोड के लिए जाती है ... बस कोड को असेंबलर में अनुवाद करना होगा और फिर आपके पास कुंजी होगी, चाहे कोड कितना भी जटिल हो।
लुंडिन

The wonderful thing about private key cryptography is that it is asymmetric. हालाँकि यह आपके पोस्ट से स्पष्ट है कि आप यह जानते हैं, मैं इसका उल्लेख अन्य पाठकों के लिए करूँगा ... उपरोक्त उद्धरण में s / निजी / सार्वजनिक।
रेडियन

आप विधि 4 का उपयोग करके किसी भी दो उपकरणों के बीच एक चैनल को सुरक्षित करने में सक्षम हो सकते हैं, हालांकि, साझा रहस्य के कुछ प्रकार के बिना, आप उस डिवाइस की प्रामाणिकता की गारंटी नहीं दे सकते हैं जिसके साथ आप संचार कर रहे हैं। यदि आपके उपयोग के मामले में प्रमाणीकरण की आवश्यकता होती है, तो आप एक प्रमुख एक्सचेंज से बेहतर नहीं हैं, यदि आप बस एक साझा रहस्य को फ्लैश में संग्रहीत कर रहे हैं। यदि आपको बेहतर सुरक्षा की आवश्यकता है, तो एक क्रिप्टो चिप का उपयोग किया जाना चाहिए।
ग्रेग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.