पिछले कुछ समय में आपने अपने कोड की सुरक्षा के लिए कई तरीकों के बारे में सुना होगा, लेकिन वे या तो बहुत सरल थे (कम सुरक्षित), हर नए ग्राहक के लिए कोड को दोबारा संकलित करने की आवश्यकता थी (अगर आपके पास केवल कुछ ग्राहक हैं तो ठीक है) या फिर बहुत जटिल थे जिसमें एक रिमोट होस्ट से ग्राहक टर्मिनल को मान्य करना शामिल था।
यहाँ मैं एक सरल पासवर्ड सत्यापन योजना का प्रस्ताव कर रहा हूँ जो MT4 के अंतर्निर्मित सुरक्षा इंजन का उपयोग करती है, जिसमें DES/ECB एन्क्रिप्शन शामिल है और हर नए ग्राहक के लिए कोड को दोबारा संकलित करने की आवश्यकता नहीं होती।
कनाडा के कई हाई-प्रोफाइल स्मार्ट कार्ड पहलों पर काम करने के बाद, मैं वित्तीय संस्थानों और कार्ड जारीकर्ताओं द्वारा उपयोग किए जाने वाले विभिन्न सुरक्षा योजनाओं से काफी परिचित हो गया। पहले आपको खुद से यह सवाल करना होगा "क्या खतरे में है?"। जब इन लोगों के साथ एक प्रोजेक्ट की शुरुआत की जाती है तो हमेशा एक जोखिम मूल्यांकन किया जाता है। अगर जवाब "करोड़ों डॉलर" है, तो यह सुरक्षा योजना आपके लिए नहीं है।
लेकिन अगर आपका जवाब है "अगर कोई मेरे सुरक्षा योजना को हैक करने में साल भर बिताता है तो एक या दो महीने का कोडिंग", तो यह समाधान आपके लिए है। इस एन्क्रिप्शन योजना में उपयोग किया जाने वाला एकल DES कुंजी आपके कोड के लिए पर्याप्त सुरक्षा प्रदान करेगा और नए ग्राहकों के लिए कोड को दोबारा संकलित करने की आवश्यकता नहीं होगी।
आपकी सुविधा के लिए मैंने दो स्रोत फ़ाइलें उपलब्ध कराई हैं। पहली "Password_Check" है, जिसे आप अपने इंडिकेटर या एक्सपर्ट एडवाइजर में जोड़ेंगे। यह उपयोगकर्ता द्वारा "Password" इनपुट पैरामीटर में दर्ज किए गए पासवर्ड की पुष्टि करेगा, और अगर पासवर्ड गलत है (या अगर उपयोगकर्ता ऑफलाइन है) तो यह एक उपयोगकर्ता के अनुकूल संदेश प्रदर्शित करेगा, एक्सपर्ट को हटा देगा (अगर वह चल रहा है) और INIT_FAILED स्थिति वापस करेगा।
दूसरी फ़ाइल, "Password_Generate", का उपयोग आपके द्वारा सुरक्षा की जाने वाली ग्राहक का नाम और खाता संख्या दर्ज करने के लिए किया जाता है। यह उत्पन्न पासवर्ड प्रदर्शित करेगा ताकि आप इसे अपने ग्राहकों को दे सकें। स्पष्ट है कि, आप इसे अपने अंतिम उत्पाद में शामिल नहीं करना चाहते! :)
तो चलिए शुरू करते हैं...
पहले, हमें अपने इंडिकेटर या एक्सपर्ट एडवाइजर के लिए एक इनपुट स्ट्रिंग परिभाषित करनी होगी:
//--- इनपुट पैरामीटर extern string Password;
अगला, हम init() फ़ंक्शन में कोड जोड़ते हैं ताकि पासवर्ड की जांच की जा सके और अगर पासवर्ड गलत है, उपयोगकर्ता ऑफलाइन है या उपयोगकर्ता ने बस कोई पासवर्ड नहीं डाला है, तो एक संदेश प्रदर्शित किया जा सके।
//+------------------------------------------------------------------+ //| एक्सपर्ट प्रारंभिककरण फ़ंक्शन | //+------------------------------------------------------------------+ int init() { string client = NULL; // ग्राहक ऑनलाइन है यह सुनिश्चित करने के लिए कि उसका नाम और खाता संख्या प्राप्त की जा सके if(IsConnected()) client = AccountInfoString(ACCOUNT_NAME) + " / " + DoubleToStr(AccountInfoInteger(ACCOUNT_LOGIN), 0); // ग्राहक का पासवर्ड जांचें if(!Password_Check(client)) { if(StringLen(Password) != 0) MessageBox("ग्राहक और खाता संख्या की पुष्टि करने में असमर्थ!" + (IsConnected() ? " कृपया सुनिश्चित करें कि आपके पास सही पासवर्ड है।" : " आपको सत्यापन के लिए ऑनलाइन होना आवश्यक है।"), (IsConnected() ? "अमान्य पासवर्ड!" : "ऑफलाइन!"), MB_OK | MB_ICONSTOP); else MessageBox("अनधिकृत सॉफ़्टवेयर। कृपया सॉफ़्टवेयर विक्रेता से संपर्क करें ताकि आपको अपना व्यक्तिगत सक्रियण पासवर्ड प्राप्त हो सके।" + (StringLen(client) == 0 ? "" : " आपकी पंजीकरण जानकारी है: '"+client+"'"), "अनधिकृत", MB_OK | MB_ICONSTOP); // अमान्य पासवर्ड या उपयोगकर्ता ऑफलाइन। एक्सपर्ट को हटा दें और त्रुटि के साथ बाहर निकलें ExpertRemove(); return(INIT_FAILED); } // सब कुछ ठीक है... return(INIT_SUCCEEDED); }
अब आते हैं मुख्य बिंदु पर... हमें ग्राहक का नाम और खाता संख्या को हमारे DES कुंजी के साथ एन्कोड करना होगा, परिणाम को BASE64 में एन्कोड करना होगा और दर्ज किए गए पासवर्ड से इसकी तुलना करनी होगी। यदि परिणाम मेल खाता है, तो आपके पास एक खुश ग्राहक है। यदि नहीं, तो आपके पास कोई हैकर है जो आपके DES कुंजी को क्रैक करने की कोशिश कर रहा है। यह देखते हुए कि एक्सपर्ट एडवाइजर हर बार जब एक गलत पासवर्ड दर्ज किया जाता है, तो खुद को हटा देगा, आप शायद इससे पहले कि वे सफल हों, बोरा बोरा में रिटायर हो जाएंगे!
//+------------------------------------------------------------------+ //| ग्राहक का पासवर्ड मान्य करें //+------------------------------------------------------------------+ bool Password_Check(string client) { string MasterKey; uchar dst[], src[], key[]; // यहाँ अपनी एन्क्रिप्शन कुंजी परिभाषित करें। DES/ECB एन्क्रिप्शन के लिए 7 वर्णों की आवश्यकता है // अपना पासवर्ड समझने में कठिन बनाएं। आपका अंतिम नाम एक अच्छा विचार नहीं है! // कुछ ऐसा जैसे "wLdU&$z" अच्छा होगा। अभी के लिए, हम एक सरल एक का उपयोग करेंगे... MasterKey = "NotDemo"; // MasterKey को वर्ण मैट्रिक्स में परिवर्तित करें StringToCharArray(MasterKey, key); // सुनिश्चित करें कि ग्राहक स्ट्रिंग नल नहीं है if(StringLen(client) == 0) return(false); // DES कुंजी का उपयोग करके ग्राहक को एन्क्रिप्ट करें StringToCharArray(client, src); CryptEncode(CRYPT_DES, src, key, dst); // कुंजी को साफ करें और BASE64 में एन्कोड करें ArrayInitialize(key, 0x00); CryptEncode(CRYPT_BASE64, dst, key, src); // पासवर्ड की तुलना करें और परिणाम लौटाएँ return(CharArrayToString(src) == Password); }
बस इतना ही! अब हम ग्राहक का नाम (जो MetaTrader 4 के ग्राहक खाता नाम से लिया गया है) और ग्राहक खाता संख्या (जो MetaTrader 4 से भी लिया गया है) को मान्य कर सकते हैं।
यदि आपकी लाइसेंसिंग नीति एक ही ग्राहक के लिए कई खातों की अनुमति देती है, तो आपको केवल 'client' स्ट्रिंग से खाता संख्या को हटाना होगा, जैसा कि निम्नलिखित है:
// सुनिश्चित करें कि ग्राहक ऑनलाइन है ताकि ग्राहक का नाम प्राप्त किया जा सके if(IsConnected()) client = AccountInfoString(ACCOUNT_NAME);
बेशक, आप "ब्रोकर नाम", "खाता नाम" और "खाता लॉगिन" के साथ मिश्रण और मेल कर सकते हैं जैसा कि आप उचित समझते हैं। बस याद रखें कि 'client' वेरिएबल जितना लंबा होगा, एन्क्रिप्टेड पासवर्ड उतना ही लंबा होगा।
अब, आइए "Password_Generate" कोड पर एक नजर डालते हैं। हम वही करना चाहते हैं जैसा कि "Password_Check" में है, लेकिन पासवर्ड को EA में दर्ज करने के बजाय, हम ग्राहक का नाम (या ब्रोकर नाम, खाता नाम और खाता लॉगिन का संयोजन) दर्ज करना चाहते हैं जिसे एन्क्रिप्ट किया जाना है और फिर उत्पन्न पासवर्ड प्रदर्शित करना है। यही आप अपने ग्राहकों को तब देंगे जब वे आपका किक-ऐस इंडिकेटर और/या एक्सपर्ट एडवाइजर खरीदेंगे।
फिर से, अपने init() फ़ंक्शन में आप निम्नलिखित कोड जोड़ेंगे।
//+------------------------------------------------------------------+ //| एक्सपर्ट प्रारंभिककरण फ़ंक्शन | //+------------------------------------------------------------------+ int init() { string Password = NULL; // सुनिश्चित करें कि ग्राहक इनपुट खाली नहीं है if(StringLen(Client) != 0) { // ग्राहक पासवर्ड उत्पन्न करें Password = Password_Generate(Client); // उत्पन्न पासवर्ड प्रिंट करें (कट और पेस्ट करना आसान बनाता है) Print("ग्राहक: '"+Client+"' पासवर्ड: "+Password); // ग्राहक के लिए उत्पन्न पासवर्ड प्रदर्शित करें MessageBox("ग्राहक / खाता के लिए उत्पन्न पासवर्ड '"+Client+"' है: "+Password, "पासवर्ड जनरेटर", MB_OK | MB_ICONINFORMATION); } else MessageBox("आपको ग्राहक / खाता संख्या निर्दिष्ट करनी होगी!", "पासवर्ड जनरेटर", MB_OK | MB_ICONSTOP); // सब कुछ ठीक है। एक्सपर्ट को हटा दें। ExpertRemove(); return(INIT_SUCCEEDED); }
अब हम अपने "Password_Check()" फ़ंक्शन में थोड़ी सी संशोधन करते हैं ताकि एन्कोडेड पासवर्ड की एक स्ट्रिंग वापस की जा सके। याद रखें कि "Password_Check()" फ़ंक्शन और "Password_Generate()" फ़ंक्शन दोनों में एक ही पासवर्ड का उपयोग करें। आप कल्पना कर सकते हैं कि अगर आप ऐसा नहीं करते हैं तो क्या होगा!
//+------------------------------------------------------------------+ //| ग्राहक जानकारी को एन्क्रिप्ट करें और पासवर्ड लौटाएं //+------------------------------------------------------------------+ string Password_Generate(string client) { string MasterKey; uchar dst[], src[], key[]; // यहाँ अपनी एन्क्रिप्शन कुंजी परिभाषित करें। DES/ECB एन्क्रिप्शन के लिए 7 वर्णों की आवश्यकता है // यह वही पासवर्ड होना चाहिए जो "Password_Check()" फ़ंक्शन में परिभाषित किया गया है! // अपना पासवर्ड समझने में कठिन बनाएं। आपका अंतिम नाम एक अच्छा विचार नहीं है! // कुछ ऐसा जैसा "wLdU&$z" अच्छा होगा। अभी के लिए, हम एक सरल एक का उपयोग करेंगे... MasterKey = "NotDemo"; // MasterKey को वर्ण मैट्रिक्स में परिवर्तित करें StringToCharArray(MasterKey, key); // DES कुंजी का उपयोग करके ग्राहक को एन्क्रिप्ट करें StringToCharArray(client, src); CryptEncode(CRYPT_DES, src, key, dst); // कुंजी को साफ करें और BASE64 में एन्कोड करें ArrayInitialize(key, 0x00); CryptEncode(CRYPT_BASE64, dst, key, src); // एन्क्रिप्टेड पासवर्ड लौटाएं return(CharArrayToString(src)); }
बस इतना ही, यही सब कुछ है। आप अपने ग्राहक द्वारा प्रदान की गई जानकारी दर्ज करें और आप उन्हें पासवर्ड ईमेल या किसी अन्य तरीके से भेज सकते हैं। बेशक, इसका सौंदर्य यह है कि आप इसे अपने लिविंग रूम से बोरा बोरा में कर सकते हैं!
जैसा कि पहले कहा गया है, यह सुरक्षा योजना आपको हर नए ग्राहक के लिए अपने कोड को फिर से संकलित करने या एक सर्वर-साइड मान्यता होस्ट को कोड करने की आवश्यकता नहीं है, जबकि आपके कठिन परिश्रम से बनाए गए किक-ऐस इंडिकेटर / एक्सपर्ट एडवाइजर के लिए काफी अच्छी सुरक्षा प्रदान करती है!
धन्यवाद!
-क्लॉड।
संबंधित पोस्ट
- MQL5 विजार्ड: मॉर्निंग/ईवनिंग स्टार पैटर्न और स्टोकास्टिक पर आधारित ट्रेड सिग्नल
- MQL5 विजार्ड: मॉर्निंग/इविनिंग स्टार और RSI पर आधारित ट्रेड सिग्नल
- MQL5 विजार्ड: सुबह/शाम के तारे के आधार पर ट्रेड सिग्नल + CCI के साथ एक्सपर्ट एडवाइजर
- MQL5 विजार्ड: 3 ब्लैक क्रो/3 व्हाइट सोल्जर + RSI पर आधारित ट्रेड सिग्नल्स के लिए एक्सपर्ट एडवाइजर
- MQL5 विज़ार्ड: हैमर/हैंगिंग मैन पैटर्न पर आधारित ट्रेड सिग्नल्स - MetaTrader 5 के लिए