मैं सीडी कुंजी / सीरियल नंबर के साथ अपने गेम की सुरक्षा कैसे करूं?


25

इसलिए मैंने फैसला किया है कि मैं अपने XNA गेम की पायरेटेड प्रतियों को आधिकारिक गेम सर्वर (जो मॉडरेट कर रहा हूं, एक्सेस करने से रोकना चाहता हूं, ताकि गेम के लिए भुगतान करने वाले लोगों को सबसे अच्छा अनुभव मिले) को गलत या जेनरेट किए गए, डुप्लीकेट या सीडी के साथ डिस्कनेक्ट करके चाबियाँ (या सीरियल नंबर, चूंकि खेल डिजिटल है और जो भी सीडी हैं)।

मैं अपने गेम (क्लाइंट और मुख्य प्रमाणीकरण सर्वर दोनों) में उस क्रम संख्या संरक्षण प्रणाली को कैसे प्राप्त कर सकता हूं, इसलिए यह आसानी से हैक करने योग्य नहीं है?


ध्यान दें कि सॉफ्टवेयर के लिए उस तरह की अच्छी सुरक्षा करने का मुझे कोई अनुभव नहीं है।

मैंने पहले कभी ऐसा नहीं किया है, लेकिन मैं मूल बातें समझता हूं। मैं देखता हूं कि मैं क्लाइंट पर मुख्य जांच क्यों नहीं कर सकता, इसलिए मेरे लिए एक बार की कुंजी प्रविष्टि के साथ लॉगिन / पास प्रमाणीकरण का उपयोग करना ठीक है।

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

क्योंकि क्लाइंट को हैक करना बहुत आसान है, मैं केवल प्रारंभिक पंजीकरण (और संभवतः सर्वर-साइड प्रमाणीकरण) प्रक्रियाओं की रक्षा करने जा रहा हूं, इसलिए जब वे स्थानांतरित हो रहे हैं, तो कोई भी चाबियां चोरी नहीं कर सकता है।


यह भी देखें:

मल्टीप्लेयर गेम को प्रमाणीकरण कैसे संभालना चाहिए?


यदि कोई नीचे उतरता है, तो मुझे कम से कम एक टिप्पणी की उम्मीद है कि प्रश्न में क्या गलत है। दोस्तों, वास्तव में, मैं चाहता हूं कि मेरा सवाल अच्छा हो और सिर्फ मुझसे ज्यादा लोगों की मदद करें।
user1306322

4
मुझे लगता है कि यह DRM जोड़ने के लिए एक स्वचालित प्रतिक्रिया थी। यह प्रकार विशेष रूप से बुरा नहीं है, लेकिन हम में से बहुत से लोगों को इसके साथ बुरे अनुभव हैं - जैसे कि जब बीजाणु ने मेरी विंडोज स्थापित की थी।
इजाकाता 16

एक सीडी कुंजी के बजाय आपने उपयोगकर्ताओं को प्रमाणित करने के लिए लॉग ऑन करने और उपयोग करने के लिए एक उपयोगकर्ता नाम / पासवर्ड की आवश्यकता के लिए एक MMO जैसी / Minecraft जैसे दृष्टिकोण पर विचार किया है?
टेट्राद

4
एक .NET ऐप पर DRM चाहते हैं !? यह अंततः रिफ्लेक्टर जैसे उपकरणों के साथ विफल हो जाएगा। टेरारिया पर एक नजर। पाइरेसी (और बहुत अधिक राजस्व ...) के कारण विकास रुक गया है। मुझे @ टेट्राद का प्रमाणीकरण आधारित विचार पसंद है क्योंकि यह लोगों को सत्यापन समारोह को पैच करने से रोकता है। अपने सर्वर पर सभी डेटा रखें और जब उनका लॉगिन सफल होता है, तो उन्हें अपना डेटा खिलाएं। यदि आप डेटा को स्थानीय रूप से रखते हैं, तो वे प्रमाणीकरण फ़ंक्शन को केवल पैच कर सकते हैं।

2
@ अको जो कि प्रसिद्ध उद्धरण का संदर्भ था "हमें अधिक खनिजों की आवश्यकता है" । और मेरा मतलब तथ्यों और विशेषज्ञता से है। शायद विस्तार से भी। मुझे नहीं पता होगा कि जब एक महत्वपूर्ण समस्या पर पर्याप्त ध्यान दिया गया हो, तो ऐसा महसूस हुआ कि इसमें कुछ जोड़ना है, और साइट के आगंतुकों को यह विषय दिलचस्प लग सकता है (और संभवतः नए उपयोगकर्ता बन सकते हैं), इसलिए मैंने इनाम बढ़ाया।
user1306322

जवाबों:


24

मूल रूप से, आपकी तीन आवश्यकताएँ हैं:

  1. कई क्लाइंट इंस्टेंस के लिए एक ही कुंजी का उपयोग करना आसान नहीं होना चाहिए,
  2. नई मान्य कुंजी उत्पन्न करना आसान नहीं होना चाहिए, और
  3. वैध ग्राहक की चाबी चुराना आसान नहीं होना चाहिए।

पहला भाग बहुत सीधा होना चाहिए: बस दो खिलाड़ियों को एक ही समय में एक ही कुंजी के साथ एक ही सर्वर में प्रवेश न करने दें। आपके पास लॉग-इन उपयोगकर्ताओं के बारे में जानकारी का आदान-प्रदान करने वाले सर्वर भी हो सकते हैं, या एक साझा स् वयंसेवक सर्वर से संपर्क कर सकते हैं, ताकि एक ही समय में विभिन्न सर्वरों पर विभिन्न खिलाड़ियों के लिए एक ही कुंजी का उपयोग करने में भी विफल हो जाए। आप संभवतः कुंजी उपयोग के संदिग्ध पैटर्न को भी देखना चाहेंगे और यदि आप यह निर्धारित करते हैं कि कुंजी लीक हो गई है, तो इसे प्रतिबंधित कुंजी की सूची में जोड़ें।


दूसरे भाग के लिए, एक तरीका बस सभी वैध जारी किए गए कुंजी के डेटाबेस को बनाए रखना है। जब तक कुंजियाँ पर्याप्त रूप से लंबी होती हैं (कहते हैं, 128 बिट या अधिक) और बेतरतीब ढंग से चुनी गई (एक सुरक्षित आरएनजी का उपयोग करके), किसी वैध कुंजी का अनुमान लगाने के लिए किसी के भी ऑड-ईवन अनिवार्य रूप से शून्य हैं। (यदि आप बल के बल पर वैध कुंजी खोजने के प्रयासों को रोकने के लिए विफल लॉगिन प्रयासों पर किसी प्रकार की दर सीमित उपयोग करते हैं तो भी बहुत कम कुंजी सुरक्षित हो सकती है।)

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

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


तीसरे भाग के लिए, एक दृष्टिकोण यह सुनिश्चित करने के लिए है कि ग्राहक यह सत्यापित किए बिना किसी को अपनी कुंजी नहीं भेजेगा कि प्राप्तकर्ता वास्तव में वैध आधिकारिक सर्वर है। उदाहरण के लिए, आप लॉगिन प्रक्रिया के लिए एसएसएल / टीएलएस (या डीटीएलएस ) का उपयोग कर सकते हैं , अपने गेम सर्वर के लिए कस्टम प्रमाण पत्र जारी कर सकते हैं और केवल आपके द्वारा जारी क्लाइंट ट्रस्ट सर्टिफिकेट हो सकते हैं। आसानी से, टीएलएस का उपयोग करने से ग्राहक की चाबियाँ (और किसी भी अन्य ऑटोटेक्शन डेटा) को सार्वजनिक WLAN पर ईवेव्सड्रॉपर से भी सुरक्षा मिलेगी।

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

वैकल्पिक रूप से, आप अपने ग्राहकों को वास्तविक ग्राहक प्रमाणपत्र, या उनके जैसा कुछ जारी कर सकते हैं। आप या तो एक मौजूदा प्रोटोकॉल (जैसे टीएलएस) का उपयोग कर सकते हैं जो क्लाइंट प्रमाणपत्र प्रमाणीकरण (अनुशंसित) का समर्थन करता है या अपना स्वयं का कार्यान्वयन करता है, जैसे:

  • क्लाइंट प्रमाण पत्र में एक मनमानी आईडी स्ट्रिंग, एक सार्वजनिक / निजी कुंजी जोड़ी और आईडी का एक डिजिटल हस्ताक्षर और मास्टर कुंजी का उपयोग करके सार्वजनिक कुंजी होती है।
  • लॉग इन करने के लिए, क्लाइंट अपनी आईडी, सार्वजनिक कुंजी और हस्ताक्षर भेजता है। सर्वर एक अद्वितीय चुनौती स्ट्रिंग के साथ उत्तर देता है (अधिमानतः एक सर्वर आईडी और एक टाइमस्टैम्प, जिसे ग्राहक को सत्यापित करना चाहिए), जिसे ग्राहक निजी कुंजी के साथ संकेत देता है (यह साबित करने के लिए कि वे कुंजी जानते हैं) और सर्वर को हस्ताक्षर भेजता है।
  • सर्वर दोनों हस्ताक्षरों की जाँच करता है, यह साबित करता है कि आईडी + सार्वजनिक कुंजी एक वैध ग्राहक कुंजी बनाती है (क्योंकि उन्हें मास्टर कुंजी के साथ हस्ताक्षरित किया गया था) और ग्राहक कुंजी वास्तव में ग्राहक की है (क्योंकि ग्राहक निजी के साथ सर्वर की चुनौती पर हस्ताक्षर कर सकता है। कुंजी)।

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


2
एक मामूली बात - जबकि एक पूरी तरह से यादृच्छिक कुंजी अधिकतम कीस्पेस प्रदान करती है (और पूरी तरह से काम करने योग्य है यदि आप जारी की गई कुंजी के डेटाबेस के खिलाफ मान्य हैं) यह उपयोगकर्ता के अनुकूल नहीं है। कुछ सत्यापन को कुंजी में ही डालें ताकि सर्वर को हिट करने का प्रयास करने से पहले अधिकांश गलतियां पकड़ी जाएं।
लोरेन Pechtel

मुझे लगता है, @LorenPechtel के पास उपयोगकर्ता की मित्रता की कुंजी के बारे में एक मजबूत बिंदु है, और भुगतान किया गया उपयोगकर्ता गलती से टाइप कर रहा है और सर्वर को 'गलत तरीके से टाइप / वर्तनी की गलती' (टाइपो) भेजना हमेशा संभव है।
विष्णु

@ विष्णु को मैं एक ऐसे उपयोगकर्ता के रूप में जानता हूं, जो चाबियों में टाइप करते हैं, मैं प्रति समूह कुछ चेक जानकारी रखना पसंद करता हूं, भले ही इसका मतलब एक लंबी कुंजी टाइप करना हो।
लोरेन Pechtel

16

कोई 100% बचत नहीं है, लेकिन आप एक सरल दृष्टिकोण के साथ शुरू कर सकते हैं:

  • आपको जनरेट की गई कुंजियों को सत्यापित करने के लिए किसी तरह की आवश्यकता होगी, उदाहरण के लिए चेकसम। बेशक, यह पता लगाना बहुत आसान नहीं होना चाहिए।

  • वैकल्पिक (लेकिन अनुशंसित) एक सर्वर साइड डेटाबेस होगा जो सभी दिए गए कुंजियों के डेटाबेस के साथ कुंजियों का सत्यापन करता है ताकि आप चाबियाँ उत्पन्न न कर सकें, भले ही आप एल्गोरिथ्म हो (चलो इसे bruteforcing को अनदेखा करें)।

वहां से आपके पास दो अलग-अलग दृष्टिकोण हो सकते हैं, लेकिन किसी भी तरह से कुछ बहुत महत्वपूर्ण है:

  • क्लाइंट पक्ष पर कुंजी सत्यापित न करें। यह बहुत महत्वपूर्ण है, क्योंकि यह वास्तव में बल्कि .net / XNA में लिखे गए विघटित सामान के लिए आसान है। अगर आपको चाबी मांगनी है या उसे (लॉगिन या पंजीकरण) हैश की (एक जोड़ा नमक आदि के साथ) पास करना है और सर्वर पर भेजना है।

वास्तविक रास्तों के लिए:

  • प्रमाणीकरण / लॉगिन प्रक्रिया के दौरान भेजे जाने के लिए हैश की (ऊपर देखें) की आवश्यकता है।

  • एक विकल्प के रूप में (IMO बेहतर है, हालांकि कई लोग "DRM" के इस प्रकार को पसंद नहीं करते हैं): क्लाइंट में कुंजी का उपयोग बिल्कुल न करें। इसके बजाय, उपयोगकर्ता को खाते में लॉग इन करने की आवश्यकता होती है और खातों को बनाने के लिए एक वैध सीडी कुंजी (इसके लिए ऊपर उल्लेखित डेटाबेस की आवश्यकता होती है) की आवश्यकता होती है। यह आधुनिक गेम है, जैसे कोई भी पे-टू-प्ले MMORPG इसे संभालता है।

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


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

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

खैर, आप दोनों को जोड़ सकते हैं, जैसे कि कुंजी के पहले भाग को वर्णों का यादृच्छिक संयोजन और दूसरा आधा हैश। खेल बेचने वाला कोई भी किसी भी तरह से कीजन का उपयोग नहीं कर सकता (जब तक कि कोई टक्कर / संघर्ष सुनिश्चित करने का कोई तरीका नहीं हो, कुंजी के भाग के रूप में "विक्रेता आईडी" की तरह)।
मारियो

1

कई मैक गेम्स के पैंजिया सॉफ्टवेयर-क्रिएटर- ने उनके (अब मुक्त) गेम डेवलपमेंट बुक में कॉपी प्रोटेक्शन के बारे में एक विषय लिखा है। पुस्तक यह भी बताती है कि पायरेटेड कुंजी और अन्य हैक का उपयोग करने वाले लोगों के साथ कैसे व्यवहार करें। पुस्तक में मैक गेम के विकास पर ध्यान दिया गया है, लेकिन विचार अभी भी अन्य प्लेटफार्मों के लिए उपयोगी हो सकते हैं। पुस्तक के साथ शामिल प्रत्येक अध्याय के लिए स्रोत कोड है, नीचे दिए गए डाउनलोड का हिस्सा है। प्रतिलिपि सुरक्षा से संबंधित स्रोत कोड (C में लिखा गया) भी शामिल है।

पुस्तक यहां से डाउनलोड की जा सकती है


मुझे उस पुस्तकों में कुछ भी उपयोगी नहीं मिला।
user1306322

व्यक्तिगत रूप से मैं हालांकि अध्याय 16 में कुछ अच्छे सुझाव थे, लेकिन YMMV।
वोल्फगैंग श्रेयर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.