सॉकेट के माध्यम से एक मल्टीप्लेयर गेम के लिए प्रमाणीकरण


11

मैं नए मल्टीप्लेयर गेम के लिए एक कस्टम बाइनरी प्रोटोकॉल लागू कर रहा हूं, जिस पर मैं काम कर रहा हूं। इसकी बारी आधारित रणनीति का खेल इतना समय वास्तव में मायने नहीं रखता है। मुझे वर्तमान में सिस्टम का मूल डेटा सिंक भाग पूरा मिल गया है, और मैं सोच रहा था कि उपयोगकर्ता लॉगिन / लॉगआउट और एन्क्रिप्शन आमतौर पर MMORPG गेम या इसी तरह के लिए कैसे किया जाता है।

  • क्या आप लॉगिन के दौरान सुरक्षित / गुप्त पासवर्ड प्रसारण के लिए एक योजना की सिफारिश कर सकते हैं? (डिफी-हेलमैन कुंजी विनिमय?)
  • मैं डेटा पैकेट के लिए मजबूत एन्क्रिप्शन कैसे लागू करूं? (एईएस 128-बिट? .. या जो भी योजना इस पोस्ट को संदर्भित करता है "एन्क्रिप्शन मजबूत से आप दरार होने की संभावना है")
  • क्या डेटाग्राम प्रारूप योजनाएं हैं जो गेम सर्वर को हमलों, अवैध डेटा पैकेट और इस तरह से फिर से खेलना करने के लिए सख्त करने में मदद करती हैं?

जवाबों:


15

जवाब

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

विचार

क्या आपका प्रमाणीकरण सुरक्षित होना चाहिए? पूर्ण रूप से। जब कोई पासवर्ड विचाराधीन हो, तो सुरक्षा के संदर्भ में कोई समझौता न करें। इस प्रकार आपको निश्चित रूप से मेरे जवाब में पहली गोली पर विचार करना चाहिए।

क्या आपका डेटा सुरक्षित होना चाहिए? केवल अगर यह एक इन-गेम खरीद / माइक्रो-लेन-देन है - और फिर HTTPS की तरह सिर्फ कुछ आजमाया हुआ और सच क्यों नहीं है। अपने गेम ट्रैफ़िक को एन्क्रिप्ट करना निम्नलिखित कारणों से व्यवहार्य समाधान नहीं है:

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

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

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


2
+1 यह कहने के लिए कि धोखा रोकने के लिए डेटा पैकेट को एन्क्रिप्ट करना बेकार है। ओपी: ग्राहक से प्राप्त होने वाली हर चीज़ को सत्यापित करें , पवित्रता की जाँच करें, अगर ग्राहक द्वारा की गई कार्रवाई संभव है तो हथियार की जाँच करें, हथियार रेंज, गति की गति आदि की जाँच करें, लेकिन अपने ग्राहक को सुरक्षित करने में समय बर्बाद न करें क्योंकि यह हैक हो जाएगा आपका खेल इसके लायक है। कुछ MMO कंपनियां अपने ग्राहकों / प्रोटोकॉल को एन्क्रिप्ट और बाधित करती हैं लेकिन यह धोखा देने से रोकने के लिए नहीं है, लेकिन उदाहरण के लिए बीओटी रचनाकारों को अच्छे परिणाम प्राप्त करने के लिए इसे और अधिक कठिन बनाना है, और यहां तक ​​कि विशेषज्ञों की समर्पित टीमों द्वारा भी किया जाता है।
गिलाद

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

+1 बहुत पूर्ण उत्तर के लिए धन्यवाद। अभी एसआरपी लागू करने पर विचार किया जा रहा है। पासवर्ड के लिए उपयोग किए जाने वाले हैश फ़ंक्शन के बारे में आपकी क्या सिफारिशें हैं? MD5? ऐसे उपयोग-मामले के लिए ओटीआर प्रोटोकॉल (ऑफ द रिकॉर्ड) कैसा होगा? यह एसआरपी के बजाय ऑर्टिकल / क्रिप्टो के लिए अच्छा काम करेगा? यदि मैं SRP का उपयोग करता हूं, तो क्या मुझे निम्नलिखित "प्रमाणित एन्क्रिप्शन" में से किसी एक का उपयोग करने की आवश्यकता होगी? (OCB 2.0, कुंजी लपेटें, CCM, EAX, एन्क्रिप्ट-तब-मैक और GCM)
रॉबिनिक्स

1
@ जेएनके एल्गोरिदम (संभावित SHA1) के SHA परिवार का उपयोग करते हैं - आपको इन दिनों MD5 से बचना चाहिए। OTR वास्तव में ऐसी कोई चीज़ नहीं है जिसे आपको देखना चाहिए - इसे सुरक्षित / अस्पष्ट (वास्तव में इसके डिज़ाइन किए जाने के लिए नहीं बनाया गया है ताकि कोई और अधिक आसानी से पैकेट बना सके) यह भी त्वरित संदेश भेजने के लिए डिज़ाइन किया गया है और मशीन संचार के लिए नहीं। उन मोड में से किसी की आवश्यकता नहीं है, बस एसआरपी का उपयोग करें: एक बार जब आपके पास एक पारस्परिक रूप से बातचीत की गई सममित कुंजी होती है, तो बस कुछ एन्क्रिप्ट करने में सक्षम होने के लिए पर्याप्त गारंटी होती है कि आप सही तीसरे पक्ष से बात कर रहे हैं। इसके अलावा, फिर से, मेरे पिछले दो पैराग्राफ फिर से पढ़ें।
जोनाथन डिकिंसन

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

2

मुझे लगता है कि जोनाथन के अन्यथा उत्कृष्ट उत्तर के लिए मेरी अंतिम टिप्पणी अपने स्वयं के उत्तर में विस्तार करने लायक है:

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

इसके बजाय, एक मौजूदा, मानकीकृत और अच्छी तरह से परीक्षण की गई क्रिप्टो लाइब्रेरी को खोजने की कोशिश करें जो आपको चाहिए। आपके मामले में, मैं GnuTLS की सिफारिश करूंगा , जो विकिपीडिया के अनुसार , TLS-SRP प्रमाणीकरण ( RFC 5054 ) और DTLS ( RFC 6347 ) के साथ सुरक्षित UDP संचार दोनों प्रदान करता है । पूर्व में प्रवेश करने का ख्याल रखता है, जबकि बाद वाला सुरक्षित चैनल की रक्षा करता है, जो कि ईव्सड्रॉपिंग और सक्रिय हमलों दोनों से बनता है, और यहां तक ​​कि आपको रिप्ले हमलों से भी बचा सकता है ।


मैं टीसीपी का उपयोग कर रहा हूं। यह एक विशिष्ट ग्राहक के लिए एक बहुत अलग तरह का खेल है। जुआ / सट्टेबाजी के समान, सभी जानकारी जो कि प्रक्रिया को हाईजैक करने के लिए इस्तेमाल की जा सकती है, घर द्वारा अनावश्यक नुकसान की संभावना को बढ़ाती है। हमें डेटा को बेहद सुरक्षित रखने की आवश्यकता है, क्योंकि इस मामले में जानकारी पैसा है।
रोबिनिक्स

ठीक है, यदि आप टीसीपी का उपयोग कर रहे हैं, तो यह और भी आसान है: आप डीटीएलएस के बजाय सामान्य टीएलएस 1.2 का उपयोग कर सकते हैं, जो आपको चुनने के लिए अधिक विकल्प देता है। मैं अभी भी GnuTLS पुस्तकालय की सिफारिश करूंगा।
इल्मरी करोनें

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

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