C #: असेंबली पर हस्ताक्षर क्यों?


146

कुछ C # कोड में मैंने (Visual Studio 2005 में) लिया है, मैंने देखा है कि असेंबली सभी एक ही .snkफ़ाइल के साथ हस्ताक्षरित हैं ।

  • पिछले लेखक ने इस तरह से विधानसभाओं पर हस्ताक्षर क्यों किए होंगे?
  • क्या विधानसभाओं पर हस्ताक्षर करना आवश्यक है और हस्ताक्षर नहीं करने से क्या गलत होगा?
  • विधानसभाओं पर हस्ताक्षर करने में क्या नुकसान हैं - क्या यह देरी का कारण बनता है?

जवाबों:


186

पिछले लेखक ने इस तरह से विधानसभाओं पर हस्ताक्षर क्यों किए होंगे?

कोई विचार नहीं, शायद वह चाहता था कि उसकी सभी विधानसभाएं एक ही कुंजी के साथ हस्ताक्षरित हों।

क्या विधानसभाओं पर हस्ताक्षर करना आवश्यक है और इस पर हस्ताक्षर नहीं करने से क्या गलत होगा?

नहीं, यह आवश्यक नहीं है, लेकिन यह एक तंत्र है जो आपको एक विधानसभा की प्रामाणिकता सुनिश्चित करने की अनुमति देता है। यह आपको यह सुनिश्चित करने की अनुमति देता है कि किसी असेंबली के साथ छेड़छाड़ नहीं की गई है और वास्तव में इस लेखक की उत्पत्ति हुई है। यदि आप उन्हें GAC में रखना चाहते हैं तो यह आवश्यक है।

विधानसभाओं पर हस्ताक्षर करने में क्या नुकसान हैं - क्या यह देरी का कारण बनता है?

हस्ताक्षरित असेंबली केवल अन्य हस्ताक्षरित असेंबली लोड कर सकते हैं। इसके अलावा, वे एक विशिष्ट संस्करण से बंधे हैं जिसका अर्थ है कि यदि आप एक अलग संस्करण का उपयोग करना चाहते हैं, तो आपको बाध्यकारी पुनर्निर्देशन का उपयोग करना होगा या एप्लिकेशन को फिर से स्थापित करना होगा। हस्ताक्षर के सत्यापन के कारण थोड़ा सा प्रदर्शन ओवरहेड है, लेकिन यह इतना कम है कि आपको इसके बारे में चिंतित नहीं होना चाहिए।


2
ध्यान दें कि जीएसी में रखे जाने पर हस्ताक्षर का सत्यापन अब (.NET 2.0 के बाद से) नहीं होता है; यह केवल एक बार होता है, जब इसे GAC में जोड़ते हैं
हाबिल

1
आजकल इस पर हस्ताक्षर करने के बारे में आपका क्या विचार है? वेब आधारित प्रणालियों पर? अगर मैं सही हूं, तो यह आवश्यक था जब स्थापित सॉफ्टवेयर्स के बारे में बात की जाए, सही? यदि मैं अपने एप्लिकेशन को TFS का उपयोग करके Azure में प्रकाशित करता हूं, तो मुझे पता है कि यह छेड़छाड़ नहीं की गई है, है ना? या मुझे कुछ सुरक्षा हिस्सा याद आ रहा है?
रिक वोल्फ

पहले सवाल पर: उन्होंने एक प्रोजेक्ट से प्रोजेक्ट टेम्प्लेट बनाया जिसमें असेंबली सिग्नेचर की फाइल थी, फिर उन्होंने उस प्रोजेक्ट टेम्प्लेट का उपयोग एक अन्य सामान बनाने के लिए किया और वह की फाइल को बदलना भूल गया। (बस "वह" को "मुझे" से बदलें और आप जानते हैं कि मैं आज सुबह क्या कर रहा था :))। तो, यह आकस्मिक है।
हार्डीवेल्स

33

यदि आप उन्हें GAC में रखना चाहते हैं, तो आपको विधानसभाओं पर हस्ताक्षर करने की आवश्यकता है ।

यदि आप एक निष्पादन योग्य पर हस्ताक्षर करते हैं, तो यह लिंक करने वाले किसी भी वर्ग के पुस्तकालयों पर भी हस्ताक्षर करने की आवश्यकता है। यदि आप किसी तृतीय-पक्ष लायब्रेरी का उपयोग कर रहे हैं, तो यह मुश्किल हो सकता है (विशेषकर यदि आपको ActiveX नियंत्रण या समान उपयोग करने की आवश्यकता है )।

रिचर्ड ग्रिम्स ने .NET में सुरक्षा के बारे में एक अच्छी कार्यशाला लिखी है और इसमें इस बारे में एक अध्याय शामिल है: सुरक्षा कार्यशाला

सभी असेंबलियों के एक ही .snk फ़ाइल के साथ हस्ताक्षर किए जाने का कारण यदि वह कोड कवरेज के साथ यूनिट परीक्षण का उपयोग कर सकता है। कोड कवरेज करने में सक्षम होने के लिए (कम से कम विज़ुअल स्टूडियो 2005 के परीक्षण संस्करण में निर्मित उपकरणों के साथ) और यदि असेंबली पर हस्ताक्षर किए जाते हैं, तो आपको यह निर्दिष्ट करने की आवश्यकता है कि हस्ताक्षर के लिए .snk फ़ाइलों का उपयोग क्या किया जाता है, लेकिन मुझे लगता है कि आप कर सकते हैं। संपूर्ण समाधान के लिए एक .snk फ़ाइल निर्दिष्ट करें, इसलिए यदि आप विभिन्न वर्ग पुस्तकालयों को विभिन्न .snk फ़ाइलों के साथ साइन करते हैं, तो आप केवल एक समय में उनमें से किसी एक पर कोड कवरेज की जांच कर सकते हैं।


17

एक विधानसभा पर हस्ताक्षर करने का एक बहुत महत्वपूर्ण कारण है ताकि आप यह सुनिश्चित कर सकें कि यह आपकी विधानसभा है। चूंकि निजी कुंजी आपकी है, इसलिए कोई भी व्यक्ति उसी कुंजी के साथ असेंबली पर हस्ताक्षर नहीं कर सकता है। इसका मतलब यह है कि जब किसी विधानसभा की सार्वजनिक कुंजी आप जानते हैं (आप GetType().Assembly.GetName().GetPublicKey()फ़ंक्शन का उपयोग करके इसे पुनः प्राप्त कर सकते हैं ), विधानसभा आपकी है और इसके साथ छेड़छाड़ नहीं की गई है।


1

डीएल पर हस्ताक्षर करने के सभी उपयोगों के बावजूद, डीएलई को केवल दो कारणों से हस्ताक्षरित किया जाना चाहिए

1. संस्करण

2. प्रमाणीकरण

ए। वर्जन दर्शाता है कि dll किस वर्जन पर बनाया गया है और उन्हें GAC में धकेलने के दौरान एक ही नाम के साथ दो dll मौजूद हो सकते हैं लेकिन अलग-अलग वर्जन

ख। प्रमाणीकरण यह दर्शाता है कि क्या dll में छेड़छाड़ नहीं की गई है और यह उसी समय मौजूद है जब इसे बनाया गया था।

यदि आप मूल बातें और dll पर हस्ताक्षर करने के बारे में अधिक समझना चाहते हैं, तो आप यहां देख सकते हैं


1
आजकल इस पर हस्ताक्षर करने के बारे में आपका क्या विचार है? वेब आधारित प्रणालियों पर? अगर मैं सही हूं, तो यह आवश्यक था जब स्थापित सॉफ्टवेयर्स के बारे में बात की जाए, सही? यदि मैं अपने एप्लिकेशन को TFS का उपयोग करके Azure में प्रकाशित करता हूं, तो मुझे पता है कि यह छेड़छाड़ नहीं की गई है, है ना? या मैं कुछ सुरक्षा भाग को याद कर रहा हूं?
रिक वोल्फ

1
मुझे एक कारण नहीं दिखाई देता है कि हमें अब एक डीएल पर हस्ताक्षर क्यों करना चाहिए, जिसे एज़्योर में पेस समाधान के रूप में तैनात किया जाएगा। लेकिन अगर आप iaas समाधान कर रहे हैं, तो आप उसी iis में वेब एप्लिकेशन द्वारा dll का पुन: उपयोग कर सकते हैं। जिसकी मैं अनुशंसा नहीं करता। हमें उन्हें GAC (microservice आर्किटेक्चर) से उन dll का उपयोग करने के बजाय, api url के नाम से पुकारना चाहिए।
कार्तिकेयन वीके

1

मौजूदा उत्तरों के अलावा, मैं यह जोड़ना चाहूंगा कि जब आपका DLL डायनेमिक रूप से लोड होने वाला हो और तीसरे चरण के सॉफ़्टवेयर द्वारा खपत होने वाला हो, तो आपको साइनिंग का उपयोग करना होगा । यह प्रति से तकनीकी आवश्यकता नहीं है, लेकिन यह तर्कसंगत है, इसलिए बहुत सामान्य है, कि 3 पार्टी सॉफ्टवेयर निर्माता सुरक्षा चिंताओं के कारण ऐसी नीति लागू करते हैं।

उदाहरण जहाँ आपको असेंबली साइन करनी चाहिए:

  • विंडोज शेल / विंडोज एक्सप्लोरर एक्सटेंशन का विकास, जैसे: विंडोज एक्सप्लोरर के लिए संदर्भ मेनू एक्सटेंशन
  • विज़ुअल स्टूडियो एक्सटेंशन का विकास, जैसे: प्रोजेक्ट / आइटम टेम्प्लेट विज़ार्ड जीयूआई

0

हस्ताक्षर और संयोजन महत्वपूर्ण है। यह सुनिश्चित करने के लिए कि एक्स या असेंबली केवल उस पीसी पर स्थापित है।

Ie: यदि आप उस फ़ोल्डर को कॉपी करते हैं और दूसरे पीसी में डालते हैं तो यह काम नहीं करता है। चूँकि यह उस मशीन में केवल उस असेंबली पर हस्ताक्षर कर रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.