ในช่วงที่ผ่านมา มีวิธีการปกป้องโค้ดของคุณมากมาย แต่ก็มีข้อจำกัดต่าง ๆ ไม่ว่าจะเป็นการที่ไม่ปลอดภัยพอ หรือการที่ต้องทำการคอมไพล์โค้ดใหม่สำหรับลูกค้าทุกคน ซึ่งจะโอเคถ้าคุณมีลูกค้าแค่ไม่กี่คน แต่หากคุณวางแผนที่จะมีลูกค้าเยอะ การป้องกันที่ซับซ้อนเกินไปก็ไม่ใช่คำตอบที่ดี
วันนี้ผมขอเสนอวิธีการตรวจสอบรหัสผ่านแบบง่าย ซึ่งใช้เครื่องมือด้านความปลอดภัยที่มีอยู่แล้วใน MT4 โดยให้การเข้ารหัสแบบ DES/ECB และไม่ต้องทำการคอมไพล์โค้ดใหม่สำหรับลูกค้าใหม่
จากประสบการณ์การทำงานกับโครงการการ์ดสมาร์ทที่มีชื่อเสียงในแคนาดา ผมคุ้นเคยกับแผนการรักษาความปลอดภัยที่ใช้โดยสถาบันการเงินและผู้ให้บริการการ์ดต่าง ๆ คำถามแรกที่คุณต้องถามคือ "มีความเสี่ยงอะไรบ้าง?" การประเมินความเสี่ยงเป็นสิ่งสำคัญเมื่อเริ่มโครงการกับกลุ่มนี้ หากคำตอบคือ "เงินหลายล้านดอลลาร์" ทางเลือกนี้อาจไม่เหมาะสำหรับคุณ
แต่ถ้าคุณตอบว่า "เวลาที่ใช้ในการเขียนโค้ดประมาณหนึ่งถึงสองเดือน หากมีคนใช้เวลาประมาณหนึ่งปีในการแฮ็กระบบรักษาความปลอดภัยของผม" วิธีนี้ก็เหมาะสำหรับคุณ รหัส DES ที่ใช้ในระบบเข้ารหัสนี้จะให้ความปลอดภัยที่เพียงพอสำหรับโค้ดของคุณ และไม่ต้องทำการคอมไพล์โค้ดใหม่สำหรับลูกค้าใหม่
ผมได้จัดเตรียมไฟล์ซอร์สสองไฟล์เพื่อความสะดวก ไฟล์แรกคือ "Password_Check" ซึ่งคุณจะเพิ่มเข้าไปใน Indicator หรือ Expert Advisor ของคุณ มันจะตรวจสอบรหัสผ่านที่ผู้ใช้กรอกในพารามิเตอร์ "Password" และถ้ารหัสผ่านไม่ถูกต้อง (หรือผู้ใช้ออฟไลน์) มันจะแสดงข้อความที่เข้าใจง่ายและลบ Expert (ถ้านั่นคือสิ่งที่กำลังทำงานอยู่) และคืนสถานะ INIT_FAILED
ไฟล์ที่สองคือ "Password_Generate" ซึ่งใช้ในการกรอกชื่อและหมายเลขบัญชีของลูกค้าที่คุณต้องการป้องกัน มันจะแสดงรหัสผ่านที่สร้างขึ้นเพื่อให้คุณสามารถส่งให้กับลูกค้าได้ แน่นอนว่าคุณไม่ต้องการรวมโค้ดนี้ในผลิตภัณฑ์สุดท้ายของคุณ! :)
มาเริ่มกันเลย...
ก่อนอื่น เราต้องกำหนดสตริงพารามิเตอร์ให้กับ Indicator หรือ Expert Advisor ของคุณ:
//--- input parameters extern string Password;
ถัดไป เราจะเพิ่มโค้ดในฟังก์ชั่น init() เพื่อตรวจสอบรหัสผ่านและแสดงข้อความหากรหัสผ่านไม่ถูกต้อง ผู้ใช้ออฟไลน์ หรือผู้ใช้ไม่ได้กรอกรหัสผ่านเลย
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int init() { string client = NULL; // Make sure the client is online in order to get his client name and account number if(IsConnected()) client = AccountInfoString(ACCOUNT_NAME) + " / " + DoubleToStr(AccountInfoInteger(ACCOUNT_LOGIN), 0); // Check client's password if(!Password_Check(client)) { if(StringLen(Password) != 0) MessageBox("Unable to verify client and account number!" + (IsConnected() ? " Please verify you have the correct password." : " You need to be online for verification."), (IsConnected() ? "Invalid Password!" : "Offline!"), MB_OK | MB_ICONSTOP); else MessageBox("Unregistered software. Please contact software vendor to obtain your personal activation password." + (StringLen(client) == 0 ? "" : " Your registration information is: '"+client+"'"), "Unregistered", MB_OK | MB_ICONSTOP); // Invalid password or user is offline. Remove expert and exit with error ExpertRemove(); return(INIT_FAILED); } // All good... return(INIT_SUCCEEDED); }
ตอนนี้มาที่ประเด็นหลัก เราต้องเข้ารหัสชื่อและหมายเลขบัญชีของลูกค้าด้วยคีย์ DES ของเรา เข้ารหัสผลลัพธ์เป็น BASE64 แล้วเปรียบเทียบกับรหัสผ่านที่กรอก ถ้าผลลัพธ์ตรงกัน คุณก็จะมีลูกค้าที่แฮปปี้ แต่ถ้าผลลัพธ์ไม่ตรงกัน คุณก็จะมีแฮ็กเกอร์ที่พยายามแฮ็กคีย์ DES ของคุณ ด้วยการที่ Expert Advisor จะลบตัวเองทุกครั้งที่กรอกรหัสผ่านผิด คุณอาจจะมีเวลาพักผ่อนที่ Bora Bora ก่อนที่พวกเขาจะสำเร็จ!
//+------------------------------------------------------------------+ //| Validate client's password //+------------------------------------------------------------------+ bool Password_Check(string client) { string MasterKey; uchar dst[], src[], key[]; // Define your encryption key here. Must be 7 characters for DES/ECB encryption // Make your password difficult to figure out. You last name is not a good idea! // Something like "wLdU&$z" would be good. For now, we'll use a simple one... MasterKey = "NotDemo"; // Convert MasterKey to character array StringToCharArray(MasterKey, key); // Make sure client string is not null if(StringLen(client) == 0) return(false); // Encrypt the client using DES key StringToCharArray(client, src); CryptEncode(CRYPT_DES, src, key, dst); // Clear key and encode to BASE64 ArrayInitialize(key, 0x00); CryptEncode(CRYPT_BASE64, dst, key, src); // Compare password and return result return(CharArrayToString(src) == Password); }
เพียงเท่านี้! เราสามารถตรวจสอบชื่อของลูกค้า (ซึ่งได้มาจากชื่อบัญชีลูกค้าใน MetaTrader 4) พร้อมกับหมายเลขบัญชีของลูกค้า (ซึ่งก็ได้มาจาก MetaTrader 4 เช่นกัน)
หากนโยบายการอนุญาตของคุณคือการอนุญาตให้ลูกค้าหนึ่งคนมีหลายบัญชี คุณเพียงแค่ต้องลบหมายเลขบัญชีออกจากสตริง 'client' ดังนี้:
// Make sure the client is online in order to get the client name if(IsConnected()) client = AccountInfoString(ACCOUNT_NAME);
แน่นอนว่าคุณสามารถทำการผสมผสานระหว่าง "ชื่อโบรกเกอร์" "ชื่อบัญชี" และ "หมายเลขบัญชี" ตามที่คุณเห็นว่าเหมาะสม เพียงแค่จำไว้ว่า ยิ่งสตริง 'client' ยาวขึ้น รหัสผ่านที่เข้ารหัสก็จะยาวขึ้นตามไปด้วย
ต่อไปเรามาดูโค้ด "Password_Generate" ที่เราต้องการทำเหมือนกับ "Password_Check" แต่แทนที่จะกรอกรหัสผ่านลงใน EA เราต้องการกรอกชื่อของลูกค้า (หรือการรวมกันของชื่อโบรกเกอร์ ชื่อบัญชี และหมายเลขบัญชีที่คุณเลือก) เพื่อเข้ารหัสแล้วแสดงรหัสผ่านที่สร้างขึ้น นี่คือสิ่งที่คุณจะให้กับลูกค้าของคุณเมื่อพวกเขาซื้อ Indicator หรือ Expert Advisor สุดเจ๋งของคุณ
อีกครั้ง ในฟังก์ชั่น init() ของคุณ คุณจะเพิ่มโค้ดดังต่อไปนี้
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int init() { string Password = NULL; // Make sure the Client input is not empty if(StringLen(Client) != 0) { // Generate a client password Password = Password_Generate(Client); // Print the generated password (makes it easy to cut and paste) Print("Client: '"+Client+"' Password: "+Password); // Display the password generated for client MessageBox("Password generated for client / account\n\n'"+Client+"' is:\n"+Password, "Password Generator", MB_OK | MB_ICONINFORMATION); } else MessageBox("You must specify a client / account number!", "Password Generator", MB_OK | MB_ICONSTOP); // All good. Remove expert. ExpertRemove(); return(INIT_SUCCEEDED); }
ตอนนี้เราต้องทำการปรับเปลี่ยนเล็กน้อยในฟังก์ชั่น "Password_Check()" เพื่อให้คืนค่าสตริงของรหัสผ่านที่เข้ารหัส จำไว้ว่าต้องใช้รหัสผ่านเดียวกันในฟังก์ชั่น Password_Check() และ Password_Generate() คุณสามารถนึกภาพว่ามันจะเกิดอะไรขึ้นถ้าคุณไม่ทำ!
//+------------------------------------------------------------------+ //| Encrypt client information and return the password //+------------------------------------------------------------------+ string Password_Generate(string client) { string MasterKey; uchar dst[], src[], key[]; // Define your encryption key here. Must be 7 characters for DES/ECB encryption // IT MUST BE THE SAME PASSWORD AS DEFINE IN THE "Password_Check()" function! // Make your password difficult to figure out. You last name is not a good idea! // Something like "wLdU&$z" would be good. For now, we'll use a simple one... MasterKey = "NotDemo"; // Convert MasterKey to character array StringToCharArray(MasterKey, key); // Encrypt the client using DES key StringToCharArray(client, src); CryptEncode(CRYPT_DES, src, key, dst); // Clear key and encode to BASE64 ArrayInitialize(key, 0x00); CryptEncode(CRYPT_BASE64, dst, key, src); // Return encypted password return(CharArrayToString(src)); }
แค่นี้แหละ! คุณกรอกข้อมูลที่ลูกค้าให้มาและส่งรหัสผ่านไปให้พวกเขาผ่านทางอีเมลหรือวิธีการอื่น ๆ ที่คุณเลือก แน่นอนว่า ความสวยงามของวิธีนี้คือคุณสามารถทำได้จากห้องนั่งเล่นของคุณใน Bora Bora!
ดังที่กล่าวไว้ก่อนหน้านี้ วิธีการรักษาความปลอดภัยนี้ไม่ต้องการให้คุณทำการคอมไพล์โค้ดใหม่สำหรับลูกค้าทุกคน หรือเขียนโฮสต์สำหรับการตรวจสอบฝั่งเซิร์ฟเวอร์ ในขณะที่ยังให้ความปลอดภัยที่เพียงพอสำหรับงานที่คุณสร้าง Indicator หรือ Expert Advisor สุดเจ๋งของคุณ!
ขอให้โชคดี!
-Claude.
โพสต์ที่เกี่ยวข้อง
- สร้าง Expert Advisor ด้วย MQL5 Wizard: สัญญาณซื้อขายจาก Morning/Evening Stars + MFI
- เครื่องมือสั่งซื้อ 'Hedger' - ผู้ช่วยมืออาชีพสำหรับ MetaTrader 4
- สร้าง EA บน MQL5 Wizard ด้วยสัญญาณการซื้อขายจากแท่งเทียน 3 Black Crows/3 White Soldiers + Stochastic
- การสร้าง Expert Advisor ด้วย MQL5 Wizard: สัญญาณการเทรดจาก Morning/Evening Stars + RSI
- Ilan 1.6 Dynamic HT: ระบบเทรดอัจฉริยะสำหรับ MetaTrader 5