क्या मैं सही हूँ यह सोच कर कि अगर मैं एक exe में कुछ DLLs (मजबूत नहीं नाम) है कि एक दुर्भावनापूर्ण उपयोगकर्ता मेरी DLLs की जगह और एक तरीका है कि के रूप में अगर प्रकट होता है में एप्लिकेशन वितरित कर सकता है संदर्भ कोड-हस्ताक्षर में यह मेरे द्वारा हस्ताक्षरित है, लेकिन अपना कोड चला रहा है?
हाँ अगर DLLs के शेष केवल प्रवेश किया हुआ है और मजबूत नाम नहीं वे नेट एक अपवाद को ऊपर उठाने के बिना बदला जा सकता है। आप exe के अंदर, डीएलएल को exe के समान कुंजी द्वारा हस्ताक्षरित कर सकते हैं सत्यापित कर सकते हैं। इनमें से कोई भी दृष्टिकोण किसी को आपके डीएलएल या EXE को बदलने से रोकता है।
मान लिया जाये कि यह सच है, ऐसा लगता है तुम सच में बिना एक .NET अनुप्रयोग पर हस्ताक्षर नहीं करना चाहेंगे की तरह मजबूत नामकरण पूरी बात, अन्यथा आप लोगों की आड़ में कोड निष्पादित करने की क्षमता दे रहे हैं एक ऐप आपने लिखा था?
आम तौर पर मुझे लगता है कि 'सबसे अच्छा अभ्यास' है, लेकिन फिर आप कुछ भी रोका नहीं है। एक बार जब उपयोगकर्ता को स्थानीय सिस्टम पर फ़ाइलों को बदलने का अधिकार होता है तो आप उन्हें दुर्भावनापूर्ण गतिविधि से रोकने के लिए बहुत कुछ नहीं कर सकते हैं।
कई कहानियो प्रौद्योगिकियों कि एक एकल exe में पूरा नेट परियोजनाओं का निर्माण कर रहे हैं, यह 'सबसे सुरक्षित' दृष्टिकोण बना सकता है, लेकिन अभी भी साथ छेड़छाड़ कर सकते हैं।
असली सवाल क्या आप उन्हें ऐसा करने से रोकने की कोशिश कर रहे है? मेरा कहना है, किसी को आपके डीएलएल को बदलने में दिलचस्पी क्यों होगी? वे क्या हासिल करने की उम्मीद करेंगे, उनका लक्ष्य क्या है? यदि आप किसी को निराशा की लंबी कठोर सड़क के लिए प्रक्रिया से संवेदनशील जानकारी पढ़ने से रोकने की कोशिश कर रहे हैं। मान लें कि किसी दुर्भावनापूर्ण पार्टी के पास आपके स्रोत कोड और आपकी प्रक्रिया द्वारा उपयोग की जाने वाली जानकारी के हर हिस्से तक पूर्ण पहुंच है, क्योंकि वे करते हैं। मान लीजिए कि वे आपके कोड के सभी या हिस्से को इच्छानुसार बदल सकते हैं, क्योंकि वे कर सकते हैं।
अपडेट किया गया
तो बाध्यकारी रीडायरेक्ट केवल विधानसभाओं एक ही कुंजी के साथ मजबूत नाम है, और इसलिए DLLs से बचाने करता है के साथ काम करेंगे बदला जा रहा?
सही है, प्रख्यात अपवाद के साथ कि कोड इंजेक्शन अभी भी कई तरीकों से किया जा सकता है।
... और वापस मूल प्रश्न के, बिना कोड पर हस्ताक्षर करता है मजबूत नामकरण थोड़े कोड हस्ताक्षर की बात को कमजोर?
वास्तव में नहीं। कोड हस्ताक्षर (मजबूत नामकरण नहीं) के दो अलग-अलग उद्देश्य हैं:
- प्रमाणीकरण। यह सत्यापित करना कि सॉफ्टवेयर का लेखक कौन है।
- ईमानदारी। यह सत्यापित करना कि सॉफ़्टवेयर पर हस्ताक्षर किए जाने के बाद छेड़छाड़ नहीं हुई है।
अक्सर यह केवल प्रमाणीकृत और स्थापना के दौरान मान्य है। यही कारण है कि हम अपने setup.exe पर हस्ताक्षर करते हैं, यह सुनिश्चित करने के लिए कि ग्राहक को हमारे द्वारा अनमोडेड इंस्टॉलर प्राप्त हुआ है। उन्हें "क्या आप XXXX कंपनी पर भरोसा करते हैं" के साथ संकेत दिए जाते हैं और इस प्रकार प्रमाणित/हस्ताक्षरित इंस्टॉलर को प्राधिकरण प्रदान करते हैं। एक बार इंस्टॉल हो जाने के बावजूद ओएस द्वारा कोड हस्ताक्षर करने में थोड़ा अंतर्निहित उपयोग होता है (ड्राइवरों और कुछ अन्य अस्पष्ट मामलों को छोड़कर)।
दूसरे पर मजबूत नामकरण के अस्तित्व के लिए एक पूरी तरह से अलग उद्देश्य था। यह पूरी तरह से आवेदन की 'अखंडता' पर केंद्रित है। इसके खिलाफ सत्यापित करने के लिए कोई प्रमाणपत्र नहीं, कोई हस्ताक्षर प्राधिकरण (सीए) नहीं है, उनके लिए पुष्टि करने के लिए कोई उपयोगकर्ता द्वारा प्रदर्शित जानकारी नहीं है, और कुछ भी ओएस निष्पादन योग्य के बारे में सत्यापित नहीं कर सकता है जो इसे चलाने जा रहा है।
.NET फ़्रेमवर्क कई बातों के लिए मजबूत नामों का उपयोग उन सभी को मैं शिथिल आवेदन अखंडता के रूप में वर्गीकृत:
- dll की सामग्री/exe एक हस्ताक्षरित हैश इतना है कि यह साथ छेड़छाड़ नहीं की जा सकता है।
- निर्भरता लोड करते समय प्रत्येक संदर्भ को मजबूत और सत्यापित किया जाना चाहिए।
- असेंबली जीएसी में पंजीकृत हो सकते हैं और प्रकाशक नीतियों का उपयोग किया जा सकता है।
- असेंबली के आईएल की संकलित छवि बनाने के लिए मूल छवियों को ngen'd किया जा सकता है।
मुझे यकीन है कि यहां कुछ अन्य चीजें हैं जो मुझे याद आ रही हैं, लेकिन ये प्राथमिक उपयोग हैं जिन्हें मैं जानता हूं।हस्ताक्षर और मजबूत नामकरण
* ध्यान दें: कोड पर हस्ताक्षर करने, एक DLL के लिए कुछ मामलों में उपयोगी हो सकता है के लिए उदाहरण COM ऑब्जेक्ट चिह्नित 'सुरक्षित' और एक ब्राउज़र में एम्बेडेड हस्ताक्षर किया जाना चाहिए और के रूप में मजबूत के नाम अगर यह एक निष्पादन योग्य था। कोड हस्ताक्षर असेंबली लोड किए बिना या इसके गुणों को प्रतिबिंबित किए बिना बाहरी रूप से निर्भरताओं को सत्यापित करने में भी उपयोगी हो सकता है।
मेरे पास कोई उदाहरण नहीं है जिसे मैं सुरक्षित करने की कोशिश कर रहा हूं, मैं बस कोड हस्ताक्षर/एसएन को पूरी तरह से समझने की कोशिश कर रहा हूं :-) आप सुझाव देते हैं कि एसएन को रीडायरेक्ट बाइंडिंग के साथ बाईपास किया जा सकता है ... क्या वह दयालु हार नहीं है एसएन का बिंदु पूरी तरह से? –
आप सही हैं, बाध्यकारी रीडायरेक्ट हस्ताक्षर कुंजी को बदल नहीं सकता है। मैं पोस्ट करने के बाद अपने तथ्यों की जांच करने के लिए सलाह देता हूं लेकिन विचलित हो गया। –
तो बाध्यकारी रीडायरेक्ट केवल उसी कुंजी के साथ मजबूत नामित असेंबली के साथ काम करेगा, और इसलिए * डीएलएल से आपको बदलता है? (और मूल प्रश्न पर वापस, कोड-हस्ताक्षर के बिना कोड-हस्ताक्षर कोड-हस्ताक्षर के बिंदु को कमजोर करता है?) –