2009-04-28 11 views
5

sn.exe उपयोगिता और this question के विवरण से मैं देखता हूं कि सार्वजनिक कुंजी की एक प्रति मजबूत नाम से हस्ताक्षरित प्रत्येक असेंबली में जोड़ दी गई है। यह मान्य करने के लिए पर्याप्त है कि असेंबली बाइनरी को बदला नहीं गया है।क्या मुझे .snk फ़ाइल से सार्वजनिक कुंजी प्रकाशित करने की आवश्यकता है?

लेकिन यह कैसे सत्यापित करता है कि दिए गए असेंबली को किसी दिए गए कंपनी द्वारा वास्तव में हस्ताक्षरित किया गया था और किसी दिए गए कंपनी द्वारा संकलित किया गया था? कोई भी अपनी खुद की कीपैयर उत्पन्न कर सकता है, कुछ असेंबली उत्पन्न कर सकता है और उसे अपने कीपर के साथ हस्ताक्षर कर सकता है। क्या मुझे सार्वजनिक कुंजी प्रकाशित करने की आवश्यकता है ताकि जो लोग असेंबली मूल को सत्यापित करना चाहते हैं, वे सार्वजनिक कुंजी की तुलना कर सकते हैं? यदि हां, तो ऐसा करने का सबसे अच्छा तरीका क्या है?

उत्तर

5

नहीं, आप विधानसभा के बाहर अपने सार्वजनिक कुंजी प्रकाशित करने के बाद से यह टुकड़ों में बांटा और ग्राहक के अनुप्रयोग के भीतर संदर्भ के साथ निशानी के रूप में संग्रहीत किया जाता है की जरूरत नहीं है:

AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bcd6707151635d07" 

यह सुनिश्चित करने के लिए एक विधि देता है कि असेंबली के सभी भविष्य के संस्करण एक ही कुंजी जोड़ी के खिलाफ संकलित किए गए हैं और इसलिए एक ही प्रकाशक से।

के बारे में अधिक जानकारी यह जानकारी रखने से दूसरे स्रोत को रोक दिया जा सकता है कि आप मेरे अन्य उत्तर में पाए जा सकते हैं।

3

मैंने हमेशा एक असेंबली पर हस्ताक्षर करने का उद्देश्य एक रनटाइम चेक होने के लिए समझा है ताकि यह सुनिश्चित किया जा सके कि कोड के उन्नयन विश्वसनीय स्रोत से आते हैं। प्रभावी रूप से वे इस तरह के परिदृश्य से बचने की कोशिश कर रहे हैं:

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

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

Wikipedia वही बात कहता है (केवल काफी कम शब्दों में)।


संपादित इस स्पष्ट करने के प्रयास में अधिक जानकारी के जोड़ने के लिए ...

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

तो उपयोगकर्ता जेड जो कंपनी ए से एन्क्रिप्शन लाइब्रेरी का उपयोग कर रहा है जो उसके अनुप्रयोग बिन फ़ोल्डर में है। ऐसा करने के लिए वह DLL इस प्रकार है संदर्भित कर रहा है: सार्वजनिक कुंजी के प्रयोजन के

Encryption, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bcd6707151635d07" 

three benefits साथ हमें प्रदान करने जो मैं एक समय में एक संभाल करेंगे।

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

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

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

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

यह भी ध्यान रखें कि इन सुविधाओं के सभी सुनिश्चित नहीं है (और सुनिश्चित करने के लिए दावा नहीं करते हैं) है कि मूल विधानसभा से कंपनी एक आया था, कि इस तरह के Verisign या माइक्रोसॉफ्ट के Authenticode सेवा के रूप में अन्य प्रणालियों द्वारा नियंत्रित किया जाता है, वे केवल यह सुनिश्चित एक बार जब आप असेंबली का संदर्भ लेते हैं तो केवल कंपनी ए उस कोड में बदलाव कर सकता है।

+0

यह पूरी तरह से अस्पष्ट है और लिंक्ड आलेख में स्पष्ट रूप से उल्लेख नहीं किया गया है।ऐसा करने के लिए रनटाइम को प्रत्येक असेंबली के हैंश को कैश करने की आवश्यकता होती है और यह सत्यापित होता है कि असेंबली लोड करते समय। क्या यह वास्तव में ऐसा करता है? – sharptooth

+1

जेफ़री रिचटर द्वारा "सीएलआर के माध्यम से सी #" के अनुसार यह तब होता है जब असेंबली जीएसी में नहीं होती है। पुस्तक से उद्धरण: "जब गठबंधन नामक असेंबली को जीएसी के अलावा किसी अन्य स्थान से लोड किया जाता है, तो सीएलआर असेंबली लोड होने पर हैश मानों की तुलना करता है। दूसरे शब्दों में जब भी एप्लिकेशन निष्पादित होता है और असेंबली लोड करता है तो फाइल का हैश किया जाता है यह प्रदर्शन हिट निश्चित रूप से यह सुनिश्चित करने के लिए एक ट्रेडऑफ है कि असेंबली फ़ाइल की सामग्री को छेड़छाड़ नहीं हुई है। " –

+0

मैं इस उद्धरण को "सी # सीएलआर के माध्यम से" (भी अत्यधिक अनुशंसित पुस्तक) से जोड़ दूंगा: "महत्वपूर्ण: यह तंत्र केवल यह सुनिश्चित करता है कि फ़ाइल की सामग्री को छेड़छाड़ नहीं की गई है। तंत्र आपको अनुमति नहीं देता है बताएं कि प्रकाशक कौन है जब तक कि आप बिल्कुल सकारात्मक नहीं हैं कि प्रकाशक ने आपके पास सार्वजनिक कुंजी बनाई है और आप सुनिश्चित हैं कि प्रकाशक की निजी कुंजी को कभी समझौता नहीं किया गया था। " इसलिए, भले ही वे असेंबली से सार्वजनिक कुंजी को अलग-अलग प्रकाशित करते हैं, फिर भी यह आपको प्रकाशक को सत्यापित करने की अनुमति नहीं देता है। –

2
  1. आप कुछ 3 डी पार्टी प्रमाणपत्र प्रदाता (जैसे VeriSign) के पास जाकर उन लोगों से एक प्रमाण पत्र खरीद सकते हैं (Code Signing At Verisign)।
  2. आप अपने कोड पर हस्ताक्षर करने के लिए दिए गए प्रमाण पत्र का उपयोग करते हैं जिसमें आपकी कंपनी का नाम, यूआरएल इत्यादि है।
  3. मैं आपको ऐप डाउनलोड करता हूं, और आपके ऐप पर हस्ताक्षर किए गए प्रमाणपत्रों की सूची को देखता हूं।
  4. मैं आपके प्रमाण पत्र का उपयोग करता हूं, वेरीसिगन पर वापस जाता हूं और सत्यापित करता हूं कि प्रमाणपत्र वास्तव में MyCompany, LLC को जारी किया गया है।
  5. मैं आपके प्रमाणपत्र जारी करने के लिए उपयोग किए गए प्रमाणपत्रों को देखता हूं, और सत्यापित करता हूं कि वेरीसिगन उनमें से एक है (विंडोज़ कुछ भरोसेमंद प्रमाणपत्र स्थापित है)।

सारांश:
आप केवल कि कोड को सत्यापित नहीं के साथ tinkered नहीं किया गया है, लेकिन यह भी एक प्रमाण पत्र है कि एक पार्टी तुम पर भरोसा द्वारा जारी किया गया था के साथ हस्ताक्षर किए गए।

+1

मैं ये सब समझता हूं और यही वह है जो हम वास्तव में करते हैं। लेकिन इसका मजबूत नाम और एसएसके फाइलों के साथ कुछ लेना देना नहीं है, है ना? – sharptooth

+0

यह थोड़ी देर के बाद से मैंने ऐसा किया था। लेकिन आईआईआरके आप अपने कोड पर हस्ताक्षर करने के लिए अपने प्रमाण पत्र की सार्वजनिक कुंजी का उपयोग करते हैं। अर्थात। .snk को .cer फ़ाइल से उत्पादित/निर्यात किया जाता है जिसे आप makecSign से makecert.exe का उपयोग करते हैं। ऐसा है कि हस्ताक्षर कोड वास्तव में दो चीजें करता है 1) कोड को (सुरक्षा) के साथ टिंकर होने से रोकता है 2) प्रकाशक को प्रमाणित करता है। –

संबंधित मुद्दे