.NET असेंबली पर हस्ताक्षर नहीं करने के साथ कुछ भी गलत है?


94

मेरे एक सहयोगी ने विधानसभाओं पर हस्ताक्षर करने के लिए बहुत उत्सुक है। वह सचमुच किसी भी चीज़ पर हस्ताक्षर करने की कोशिश करता है। यहां तक ​​कि जब हम Microsoft से असेंबली का उपयोग करते हैं जो हस्ताक्षरित नहीं होते हैं, तो वह स्रोत कोड लेगा, उस पर हस्ताक्षर करेगा और फिर अन्य डेवलपर्स से उसकी कॉपी का उपयोग करने के लिए कहेगा।

मैं एक विधानसभा पर हस्ताक्षर करने के पीछे मूल विचार को समझ सकता हूं: यह सुनिश्चित करने के लिए कि किसी विशेष विधानसभा को किसी डोडी हैकर द्वारा समझौता नहीं किया जाता है। इसलिए यदि हम एक सॉफ्टवेयर डेवलपमेंट कंपनी हैं, तो हमें अपने ग्राहकों को कुछ .NET लाइब्रेरी जारी करने से पहले अपनी असेंबली पर हस्ताक्षर करना चाहिए।

हालाँकि, हम मुख्य रूप से अपने स्वयं के उपयोग के लिए वेब एप्लिकेशन यहां विकसित करते हैं, और मैं सिर्फ हमारे द्वारा उपयोग की जाने वाली हर एक विधानसभा पर हस्ताक्षर करने का बिंदु नहीं देख सकता।

क्या मुझसे कोई चूक हो रही है?


1
यह यहाँ कुछ भ्रम के लायक है, "डिजिटल हस्ताक्षर" (जिनका एक सुरक्षा उद्देश्य है) और "दृढ़ता से नामित विधानसभाएं" जो नरक को ठीक करने और जीएसी को पुस्तकालयों से जोड़ने में सहायता करने के लिए एक फिक्स हैं। एक या दूसरे का उपयोग करना समान है और दोनों को एक विधानसभा पर हस्ताक्षर करने के संदर्भ में बात की जा सकती है। ऐसा लगता है जैसे कुछ पोस्टर एक के बारे में सोच रहे हैं और दूसरे एक या दोनों के बारे में सोच रहे हैं।
amalgamate

जवाबों:


49

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

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

असेंबली पर हस्ताक्षर करने के लिए, इस पर निर्भर होने वाली किसी भी असेंबली को भी हस्ताक्षरित होना चाहिए। मेरा अनुमान है कि यह सब कुछ पर हस्ताक्षर करने की आपके सहयोगी की इच्छा में योगदान देता है - संकलक इसकी मांग कर रहा है।


EDIT इस उत्तर को लिखने के बाद से आप देख सकते हैं कि समर्थक और शिविर दोनों के पास लगभग बराबर समर्थन है। यहाँ स्पष्ट रूप से एक सही उत्तर नहीं है।

हालांकि इस संपादन को मजबूर करने वाली बात यह है कि आजकल हम नूगेट से बहुत सारे ओपन सोर्स लाइब्रेरी लेते हैं, और उनमें से कई पर हस्ताक्षर नहीं किए जाते हैं। यदि आप अपनी विधानसभा पर हस्ताक्षर करना चाहते हैं, तो आपको किसी भी निर्भरता पर हस्ताक्षर करने की आवश्यकता होगी। जिन ओपन सोर्स पुस्तकालयों पर हस्ताक्षर किए गए हैं, उनमें से कई निजी कुंजी हैं जो सार्वजनिक रूप से अपने स्रोत रिपॉजिटरी में उपलब्ध हस्ताक्षर करने के लिए उपयोग की जाती हैं।

जैसा कि हर चीज के साथ होता है, व्यापार-नापसंद होते हैं। निजी वातावरण में काम करने के मेरे अनुभव में, हस्ताक्षर करने के लाभ ज्यादातर सैद्धांतिक (या अकादमिक, @ user289100 उल्लेख के रूप में) हैं, जब तक कि आप सरकारी एजेंसियों को आपके कोड को संशोधित करने के मामले में चिंतित नहीं होते हैं, तो आपको कितने स्तरों के बारे में अवगत होने की आवश्यकता है? आपका आधारभूत ढांचा जिस पर हस्ताक्षर करना प्रयास की एक छोटी राशि की तरह होगा। अन्यथा सब कुछ पर हस्ताक्षर करने के लिए बाहर आने वाली चुनौतियों की मात्रा बस इसके लायक नहीं लगती है। हालांकि आपके पर्यावरण की अलग-अलग आवश्यकताएं हो सकती हैं, या आप एक मसोकिस्ट हो सकते हैं!

मजबूत नामों का उपयोग करते समय संस्करण असेंबलियों से संबंधित चुनौतियों के बारे में जानकारी के लिए Teun D का उत्तर भी देखें ।


17
सहमत, यह उसके लिए एक दरार की लत की तरह है
जेनी

3
एक और ध्यान देने वाली बात यह है कि यदि आप इस असेंबली को अलग-अलग एप्लिकेशन में साझा करना चाहते हैं तो हस्ताक्षर करना आवश्यक है (यानी GAC)।
राजेश पिल्लई

60

मैंने गैर-हस्ताक्षरित असेंबली का लाभ उठाया है ताकि पहले मुद्दों के बारे में और अकादमिक सेटिंग्स में लोगों को दिखाया जा सके कि यह महत्वपूर्ण क्यों है। मैंने एक DLL फ़ाइल को बदल दिया था जो एक ही नाम, एक ही हस्ताक्षर के साथ बनाए गए (एक शैक्षणिक सेटिंग में) फिर से अहस्ताक्षरित थी और मूल कोड को कॉपी और पेस्ट करने के लिए .NET रिफलेक्टर का उपयोग किया था , लेकिन खान में मैंने उपयोगकर्ता नाम और पासवर्ड ईमेल किए थे 'वास्तविक' कोड को कॉल करने से पहले पारित किया जा रहा था।

यदि हस्ताक्षर किए गए हैं, तो आप एक हस्ताक्षर मैच कर सकते हैं, लेकिन प्रतिस्थापित नहीं। Zippy जो कहती है, उसके विपरीत, एक रन-टाइम कंप्लीशन एरर होगा।

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


11
यदि कोई हैकर dll को बदल सकता है तो वह उस एप्लिकेशन को भी बदल सकता है जो dll को कॉल करता है।
ZippyV

12
यह सही है कि Zippy है, लेकिन आवेदन पर हस्ताक्षर करने की कुंजी के बिना तो उन्हें एक कठिन समय मिलेगा आवेदन को चलाने के लिए आवेदन में जहां मूल आवेदन के केवल हस्ताक्षरित संस्करण को चलाने की अनुमति है, जो कई में होगा जिन वातावरण में मैंने काम किया है। आपके पेड़ों के लिए जंगल गायब होना: हस्ताक्षर न करने के लिए असेंबली एक अनावश्यक सुरक्षा जोखिम उठा रही है जिससे बचने के लिए 30 सेकंड लगते हैं और कोई व्यावसायिक मामला या वास्तविक दुनिया का मामला नहीं है जिसे मैंने कभी नहीं देखा है। एक विधानसभा पर हस्ताक्षर करें।
user289100

39

एक अतिरिक्त बिंदु: अपनी असेंबली पर हस्ताक्षर करना संस्करणों पर पिछड़े संगतता को तोड़ता है। आपके संदर्भ सभी संस्करण संख्याओं को शामिल करना शुरू करते हैं और अन्य संस्करण संख्याओं वाले संस्करणों को गैर-संगत माना जाता है। यह वितरित असेंबली के नए संस्करणों में अपग्रेड करने में बाधा उत्पन्न करता है।

मेरी राय में, आपको केवल कोड-साइन असेंबली करनी चाहिए, यदि आपको इससे कुछ ठोस लाभ मिलते हैं:

  • यदि आप ऐसे वातावरण में तैनात हैं जहाँ अविश्वासित लोग आपकी विधानसभाओं को छू सकते हैं
  • कुछ प्लग-इन मॉडल में, जहां आप ट्रस्ट को अपग्रेड करने के लिए प्रमाण के रूप में प्रमाण पत्र का उपयोग करना चाहते हैं
  • यदि आपका कोड अन्य हस्ताक्षरित कोड से कॉल करने योग्य होना चाहिए (जैसे कि एक प्रोजेक्ट, log4net का कहना है, तो उचित रूप से व्यापक रूप से उनके कोड को व्यापक रूप से प्रयोग करने योग्य होने का संकेत देता है; उन्होंने कुछ साल पहले अपनी गुप्त कुंजी को खोते हुए संगतता में बहुत गड़बड़ कर दी थी, कोड-हस्ताक्षर का एक और जोखिम) ।
  • यदि आप जीएसी में तैनात करना चाहते हैं

9

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

स्व-हस्ताक्षरित Microsoft कोड के बारे में आपका किस्सा मुझे विशेष रूप से संदेहास्पद लगता है। यदि MS कोड पर हस्ताक्षर नहीं करता है, तो संभवतः कोई कारण है, है ना? और इस पर हस्ताक्षर करके, जब आप इसे नहीं लिखते थे, तो आप इसकी जिम्मेदारी ले रहे थे - भविष्य के लिए आपको काटने का एक और अवसर।


2
वास्तव में मुझे यकीन नहीं है कि क्यों लेकिन Microsoft निश्चित रूप से एंटरप्राइज लाइब्रेरी 3.1
ऑस्करको जू

1
प्रक्रियाओं के बीच एक विधानसभा को साझा करने के लिए जीएसी में विधानसभा की आवश्यकता क्यों है?
डर्क वोल्मार

4
ऐसा नहीं है कि आप एक ही .dll के लिए रनटाइम संदर्भ साझा नहीं कर सकते हैं, यह है कि केवल मजबूत नाम (यानी हस्ताक्षर किए गए) के साथ असेंबलियों को जीएसी में प्राप्त किया जा सकता है - और असेंबलियों को जीएसी में डाल दिया जाता है ताकि उन्हें साझा किया जा सके।
डैन डेविस ब्रैकेट 1

4

असेंबली पर हस्ताक्षर करने के बारे में एक और बात यह है कि कोई आपकी जगह गलत नहीं कर सकता है (एक दुर्घटना से खुद को भी)। उदाहरण के लिए, यदि आप एक प्रोग्राम बनाते हैं जो एक असेंबली Foo.dll, संस्करण 1.0 को संदर्भित करता है, तो कोई एक असेंबली बना सकता है, उसी संस्करण के साथ, और आपकी जगह, जब आप अपने पुस्तकालय पर हस्ताक्षर करेंगे, तो यह संभव नहीं होगा (पर कम से कम मुझे नहीं लगता कि यह आसानी से संभव है)।


4

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


2
एक वेब एप्लिकेशन के लिए, हैकर को web.config को भी संशोधित करना होगा।
तंगुरेना

3
यदि कोई हैकर किसी असेंबली से हस्ताक्षर हटा सकता है, तो web.config उन्हें रोकने वाला नहीं है।
ZippyV

4
Downvoters पढ़ने के लिए सलाह दी जाती है ianpicknell.blogspot.com/2010/02/... और इसी तरह के लेख है कि एक से जुड़े।
कांस्टेंटिन

1
वर्तमान: हाँ और नहीं। मैंने कोशिश की, और Windows डिफ़ॉल्ट हस्ताक्षर ("मजबूत नाम") की जांच नहीं करना है। संभवतः उपयोगकर्ता के अनुकूल होने के लिए :-) संदर्भित लिंक यह दर्शाता है कि हस्ताक्षर की जाँच को लागू करने के लिए App.config में क्या जोड़ना है। और फिर, लेख के विपरीत, हस्ताक्षर की जांच वास्तव में काम करती है और किसी भी छेड़छाड़ का पता लगाती है, चाहे संस्करण एनआर या सामग्री के साथ।
रोलैंड

3

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

लेकिन शायद यह मेरा लघु-व्यवसाय का अनुभव है। यदि आप एक मिशन-क्रिटिकल ऑनलाइन बैंकिंग वेबसाइट के बारे में बात कर रहे हैं, तो साइन इन करें।


2

ऐसा करने के बारे में सोचें यदि आप कुछ जहाज करने जा रहे हैं और / या वास्तव में ऐसा करने का कोई कारण है। हर दूसरे मामले में, यह सिर्फ परेशानी है। मैं आपके वर्कमेट से पूछता हूँ कि वह वास्तव में ऐसा करने से क्या बाहर निकलता है।

मैं इससे पहले असेंबली-इटिस पर हस्ताक्षर कर चुका हूं और यह एक दर्द है, खासकर जब आप उन लोगों की मात्रा पर विचार करते हैं जिनके पास असेंबली पर हस्ताक्षर करने का कोई ज्ञान नहीं है, यह क्या है और इसे कैसे करना है। यह सिर्फ एक और बात है जब तक आपको बिल्कुल आवश्यक नहीं होना चाहिए।


1

जब आप वेब- क्लिकऑन XBAP परिनियोजन में इसका उपयोग करते हैं, तो आपको अपनी असेंबली पर हस्ताक्षर करने की आवश्यकता होती है ।

इसके अलावा, सभी संदर्भित विधानसभाओं पर भी हस्ताक्षर करने की आवश्यकता होगी।


1

हम अपनी असेंबली पर हस्ताक्षर करते हैं क्योंकि कई बार हमें निम्न जैसी त्रुटियां मिलती हैं (यह परीक्षण से है, लेकिन एप्लिकेशन चलाते समय हो सकता है):

System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

TearDown : System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

हमने पाया कि विज़ुअल स्टूडियो कभी-कभी गलत हो जाता है और पुराना कोड चलाता है

यदि आप एक त्रुटि चाहते हैं यदि आप पुराने कोड चला रहे हैं, तो अपनी विधानसभाओं पर हस्ताक्षर करें।

यदि आप एक नगेट पैकेज लिख रहे हैं , तो कृपया अपनी विधानसभाओं पर हस्ताक्षर करें । असम्बद्ध असेंबली हमारे लिए अजीब है जो यह सुनिश्चित करना चाहते हैं कि हम अपने कोड का नवीनतम संस्करण चला रहे हैं। मैं Visual Studio ठीक नहीं कर सकता । मैं केवल यह पता लगा सकता हूं कि विज़ुअल स्टूडियो को यह गलत लगा। तो कृपया, अपने नगेट असेंबलियों पर हस्ताक्षर करें


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