2008-12-11 9 views
20

एक वेब एप्लिकेशन के लिए, मैं एक सरल लेकिन प्रभावी लाइसेंसिंग सिस्टम बनाना चाहता हूं। सी # में, यह थोड़ा मुश्किल है, क्योंकि मेरी डिक्रिप्शन विधि को प्रतिबिंबित किसी के द्वारा देखा जा सकता है।लाइसेंस फ़ाइल एन्क्रिप्ट करने के लिए एक प्रभावी तरीका?

कि काफी छेड़छाड़ प्रूफ हैं सी # में फ़ाइलों को एन्क्रिप्ट करने के लिए कुछ तरीकों क्या हैं?

+2

तुम जो भी प्रयास करते हैं, आपके आवेदन अपने लाइसेंस फ़ाइल को डिक्रिप्ट करने की जरूरत है, हर प्रोत्साहित उपयोगकर्ता ऐसा कर सकते हैं। अपने सॉफ्टवेयर को लाइसेंस देने के अन्य तरीके के बारे में सोचें। –

उत्तर

37

ऐसा लगता है कि आप सार्वजनिक/निजी क्रिप्टोग्राफी का उपयोग कर एक लाइसेंस टोकन (एक XML टुकड़ा या उदाहरण के लिए फ़ाइल) पर हस्ताक्षर करने के रहना चाहता हूँ ताकि आप छेड़छाड़ का पता लगा सकते।

1) अपनी कंपनी के लिए एक कुंजी युग्म उत्पन्न करें: सबसे आसान तरीका है इसे संभाल करने के लिए निम्न चरणों का पालन करना है। आप एसएन उपकरण का उपयोग कर विजुअल स्टूडियो कमांड लाइन में ऐसा कर सकते हैं। सिंटेक्स है:

sn -k c:\keypair.snk 

2) दृढ़ता से नाम के लिए (अर्थात हस्ताक्षर) अपने ग्राहक आवेदन कुंजीयुग्म का प्रयोग करें। आप अपने आवेदन

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

http://msdn.microsoft.com/en-us/library/ms229745.aspx

4) ग्राहक पर, जब लाइसेंस की जाँच आप XmlDocument लोड और करने के लिए हस्ताक्षर को सत्यापित करने के लिए अपने सार्वजनिक कुंजी का उपयोग करें साबित करें कि लाइसेंस के साथ छेड़छाड़ नहीं हुई है।ऐसा करने के तरीके पर विवरण में पाया जा सकता:

http://msdn.microsoft.com/en-us/library/ms229950.aspx

कुंजी वितरण के आसपास प्राप्त करने के लिए (अर्थात यह सुनिश्चित अपने ग्राहक सही सार्वजनिक कुंजी उपयोग कर रहा है) आप वास्तव में से खुद को विधानसभा पर हस्ताक्षर किए सार्वजनिक कुंजी खींच सकते हैं। इस प्रकार यह सुनिश्चित करने के लिए कि आपके पास वितरित करने की एक और कुंजी नहीं है और यहां तक ​​कि अगर कोई असेंबली के साथ tampers .net फ्रेमवर्क सुरक्षा अपवाद के साथ मर जाएगा क्योंकि मजबूत नाम अब विधानसभा से मेल नहीं खाएगा।

/// <summary> 
    /// Retrieves an RSA public key from a signed assembly 
    /// </summary> 
    /// <param name="assembly">Signed assembly to retrieve the key from</param> 
    /// <returns>RSA Crypto Service Provider initialised with the key from the assembly</returns> 
    public static RSACryptoServiceProvider GetPublicKeyFromAssembly(Assembly assembly) 
    { 
     if (assembly == null) 
      throw new ArgumentNullException("assembly", "Assembly may not be null"); 

     byte[] pubkey = assembly.GetName().GetPublicKey(); 
     if (pubkey.Length == 0) 
      throw new ArgumentException("No public key in assembly."); 

     RSAParameters rsaParams = EncryptionUtils.GetRSAParameters(pubkey); 
     RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
     rsa.ImportParameters(rsaParams); 

     return rsa; 
    } 

मैं कम से Snipt पर उपयोगी एन्क्रिप्शन उपयोगिता का एक बहुत के साथ एक नमूना वर्ग अपलोड कर दिया है: http://snipt.net/Wolfwyrd/encryption-utilities/ मदद करने के लिए मिलता है

ग्राहक विधानसभा से सार्वजनिक कुंजी आप के समान कोड का उपयोग करना चाहते करने के लिए खींच आप अपने रास्ते पर

मैंने एक नमूना कार्यक्रम भी शामिल किया है: https://snipt.net/Wolfwyrd/sign-and-verify-example/। नमूना की आवश्यकता है कि आप इसे एन्क्रिप्शन यूटिल लाइब्रेरी के साथ समाधान में जोड़ें और हस्ताक्षर के लिए एक परीक्षण एक्सएमएल फ़ाइल और एक एसएनके फ़ाइल प्रदान करें। परियोजना को आपके द्वारा जेनरेट किए गए एसएनके के साथ हस्ताक्षर किए जाने चाहिए। यह दर्शाता है कि एसएनके से निजी कुंजी का उपयोग करके परीक्षण एक्सएमएल फ़ाइल पर हस्ताक्षर कैसे करें और फिर असेंबली पर सार्वजनिक कुंजी से सत्यापित करें।

अद्यतन

जोड़ा गया के माध्यम से एक अच्छा विस्तृत रन के साथ एक up to date blog post लाइसेंस फाइलों पर

+0

बिल्कुल मैंने जो कहा है। –

+0

बेहद सहायक एन्क्रिप्शन कोड। इसे उपलब्ध कराने के लिए वुल्फवार्ड धन्यवाद। –

+0

@Wolfwyrd: utils कि उपलब्ध कराई गई है, तो आप उन्हें कैसे उपयोग करने के लिए पर कुछ संक्षिप्त निर्देश प्रदान कर सकता है? – Ian

1

आप ऐसा क्यों है एन्क्रिप्ट करने के लिए की आवश्यकता होगी? यदि यह छेड़छाड़ कर रहा है तो आप डरते हैं (उदाहरण के लिए कोई उपयोगकर्ता की संख्या में वृद्धि करता है), क्या आप शायद इसे साइन कर सकते हैं उदा। इसके बजाय आपके संगठन का डिजिटल प्रमाणपत्र?

0

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

+0

आपका मतलब सी ड्राइव का सीरियल नंबर सही है? सामग्री नहीं और सुनिश्चित करें कि आप वॉल्यूम आईडी का उपयोग न करें, जिसे आसानी से कॉपी किया जा सके। – Martin

+0

ड्राइव को हश करना एक बुरा विचार है - रास्ता बहुत अधिक डेटा। एक "मशीन आईडी" के रूप में एक GUID की रक्षा के लिए डीपीएपीआई (मशीन-स्कोप) का उपयोग करने के लिए बेहतर (केवल अगर यह पहले से मौजूद नहीं है)। "उपयोगकर्ता आईडी" की सुरक्षा के लिए उपयोगकर्ता-स्कोप डीपीएपीआई का प्रयोग करें। – devstuff

1

लाइसेंस के साथ सुरक्षा के कुछ प्रकार प्रदान करने के लिए एक ही रास्ता के खिलाफ साख (वास्तव में सार बोली जाने वाली) अपने आप से पकड़ एक ऑनलाइन बलपूर्वक लॉग इन करना है।

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

नेट कुछ अच्छी क्रिप्टोग्राफिक वर्ग हैं, लेकिन जैसा कि आप का उल्लेख किया है, तो आप लाइसेंस के एन/decription कोडिंग कर रहे हैं, हर कोई इसे आसानी से डिकंपाइल कर सकते हैं।

7

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

हस्ताक्षर और एक हस्ताक्षरित एक्सएमएल फ़ाइल की जाँच MSDN में प्रलेखित है।

यह पाठ्यक्रम तार्किक है कि आप अपनी कंपनी पर लाइसेंस फ़ाइल पर हस्ताक्षर और ग्राहक जो फिर एक फ़ोल्डर में लाइसेंस फ़ाइल स्थानों पढ़े जाने के लिए करने के लिए लाइसेंस फ़ाइल को भेजने की है।

बेशक

, लोगों को बाहर कटौती कर सकते हैं/अपने वितरित विधानसभा हैक व एक्सएमएल हस्ताक्षर जाँच बाहर चीर, लेकिन फिर, वे हमेशा ऐसा है, तो कोई फर्क नहीं पड़ता कि आप क्या करते ऐसा करने में सक्षम हो जाएगा।

+0

मुझे एमएसडीएन सामग्री मिली जो आप बात कर रहे थे और एक्सएमएल हस्ताक्षर काफी सरल दिखता है। हालांकि, क्या आप अपने उत्तर के सार्वजनिक/निजी कुंजी भाग के बारे में कुछ और बता सकते हैं? मुझे XML फ़ाइल को साइन और सत्यापित करने के लिए दो अलग-अलग कुंजियों का उपयोग करने के बारे में कुछ भी नहीं दिखाई दिया। –

+0

एक कुंजी जोड़ी बनाने के लिए 'sn -k' का उपयोग करें। यह कुंजी जोड़ी एक्सएमएल पर हस्ताक्षर करने के लिए प्रयोग की जाती है। एक्सएमएल की जांच करने के लिए, आप सार्वजनिक भाग का उपयोग करते हैं। अपने कोड में पूरी कुंजी शामिल न करें। फ़ाइल में सार्वजनिक भाग निकालने के लिए स्नैप का उपयोग करें। उस कोड का प्रयोग करें जिसे आप लाइसेंस सत्यापित करने के लिए वितरित करते हैं। –

-1

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

एमएसडीएन लेखों से कोड का उपयोग करके, मैंने इसे सुविधाजनक बनाने के लिए एक छोटा ऐप (LicMaker) बनाया। ऐप को पूर्ण कुंजी जोड़ी के साथ हस्ताक्षरित किया गया है। इनपुट एक हस्ताक्षरित .XML लाइसेंस फ़ाइल है। आउटपुट एक हस्ताक्षरित एलआईसी फ़ाइल में मूल एक्सएमएल + हस्ताक्षर है। मेरे उत्पाद को एक ही पूर्ण कुंजी जोड़ी फ़ाइल द्वारा भी हस्ताक्षरित किया गया है। उत्पाद एलआईसी फाइल को छेड़छाड़ नहीं करता है। बहुत अच्छा काम करता है। मैंने इस समाधान के लिए स्नैप का उपयोग नहीं किया।

1

ऐसा प्रतीत होता है कि एमएसडीएन नमूने डिफ़ॉल्ट मानकों का उपयोग करते हैं और इसके परिणामस्वरूप मशीन-विशिष्ट हस्ताक्षर होते हैं जैसे कि आप एक मशीन पर हस्ताक्षर नहीं कर सकते हैं और मनमाने ढंग से अन्य मशीन पर सत्यापित नहीं कर सकते हैं। मैंने उन नमूनों में तर्क को संशोधित किया है ताकि हस्ताक्षर मशीन पर मेरे स्नैंक में कुंजियों और सत्यापन मशीन में मेरी असेंबली की कुंजी का उपयोग किया जा सके। यह एमएसडीएन नमूना और दिनचर्या (बहुत अच्छी तरह से किया गया) में लॉजिक का उपयोग करके किया गया था ऊपर से जुड़े नमूनाUtils.cs नमूना।

फ़ाइल पर हस्ताक्षर करने के लिए, मैं इस प्रयोग किया है:

RSACryptoServiceProvider rsaKey = EncryptionUtils.GetPublicKeyFromAssembly 
    (System.Reflection.Assembly.GetExecutingAssembly()); 

Btw::

RSACryptoServiceProvider rsaKey = EncryptionUtils.GetRSAFromSnkFile(keyFilePath); 

फ़ाइल की पुष्टि करने के लिए, मैं इस का इस्तेमाल किया मैंने देखा कि एक्सएमएल हस्ताक्षर सत्यापन एक्सएमएल टिप्पणियों पर ध्यान नहीं देता।

5

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

इस संस्करण में, यह सब कोड की जरूरत है:

/// <summary> 
/// Extracts an RSA public key from a signed assembly 
/// </summary> 
/// <param name="assembly">Signed assembly to extract the key from</param> 
/// <returns>RSA Crypto Service Provider initialised with the public key from the assembly</returns> 
private RSACryptoServiceProvider GetPublicKeyFromAssembly(Assembly assembly) 
{ 
    // Extract public key - note that public key stored in assembly has an extra 3 headers 
    // (12 bytes) at the front that are not part of a CAPI public key blob, so they must be removed 
    byte[] rawPublicKeyData = assembly.GetName().GetPublicKey(); 

    int extraHeadersLen = 12; 
    int bytesToRead = rawPublicKeyData.Length - extraHeadersLen; 
    byte[] publicKeyData = new byte[bytesToRead]; 
    Buffer.BlockCopy(rawPublicKeyData, extraHeadersLen, publicKeyData, 0, bytesToRead); 

    RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider(); 
    publicKey.ImportCspBlob(publicKeyData); 

    return publicKey; 
} 
+0

अच्छा जोड़ा, +1 – Wolfwyrd

0

जब आप अपने हस्ताक्षर करने/सत्यापन कोड लागू, एक अलग विधानसभा में रख के प्रति सावधान रहें। कोड एक्सेस सुरक्षा टैपर-प्रूफिंग अब बाईपास करना बहुत आसान है, जैसा लेख CAS Tamper-Proofing is Broken: Consequences for Software Licensing में बताया गया है।

अनिवार्य अस्वीकरण & प्लग: कंपनी मैं सह-संस्थापक OffByZero Cobalt licensing solution पैदा करता है।

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