หน้าแรก การเทรดด้วยระบบ โพสต์

เพิ่มการป้องกันด้วยรหัสผ่านให้กับ Indicator หรือ Expert Advisor บน MetaTrader 4

ไฟล์แนบ
15534.zip (2.42 KB, ดาวน์โหลด 1 ครั้ง)

ในช่วงที่ผ่านมา มีวิธีการปกป้องโค้ดของคุณมากมาย แต่ก็มีข้อจำกัดต่าง ๆ ไม่ว่าจะเป็นการที่ไม่ปลอดภัยพอ หรือการที่ต้องทำการคอมไพล์โค้ดใหม่สำหรับลูกค้าทุกคน ซึ่งจะโอเคถ้าคุณมีลูกค้าแค่ไม่กี่คน แต่หากคุณวางแผนที่จะมีลูกค้าเยอะ การป้องกันที่ซับซ้อนเกินไปก็ไม่ใช่คำตอบที่ดี

วันนี้ผมขอเสนอวิธีการตรวจสอบรหัสผ่านแบบง่าย ซึ่งใช้เครื่องมือด้านความปลอดภัยที่มีอยู่แล้วใน 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.

โพสต์ที่เกี่ยวข้อง

ความคิดเห็น (0)