Laman utama Perdagangan Sistem Siaran

Cara Menambah Perlindungan Kata Laluan pada Indikator / EA di MetaTrader 4

Lampiran
15534.zip (2.42 KB, Muat turun 2 kali)

Sejak dulu, pelbagai cara telah dicadangkan untuk melindungi kod anda, tetapi kebanyakannya terlalu mudah (tidak selamat), memerlukan kompilasi semula kod untuk setiap pelanggan baru (ok jika anda hanya merancang untuk mempunyai sepuluh pelanggan) atau terlalu rumit yang melibatkan host jarak jauh untuk mengesahkan terminal klien.

Di sini, saya ingin mencadangkan satu skema pengesahan kata laluan yang mudah yang menggunakan enjin keselamatan terbina dalam MT4 yang menyediakan penyulitan DES/ECB dan tidak memerlukan kompilasi semula kod untuk setiap pelanggan baru.

Setelah bekerja dalam beberapa inisiatif kad pintar terkemuka di Kanada, saya menjadi cukup biasa dengan pelbagai skema keselamatan yang digunakan oleh institusi kewangan dan pengeluar kad. Soalan pertama yang perlu anda tanya diri sendiri adalah "Apa yang berisiko?". Penilaian risiko sentiasa dilakukan ketika memulakan projek dengan mereka. Jika jawapannya adalah "Jutaan dolar", maka skema keselamatan ini bukan untuk anda.

Jika, sebaliknya, jawapan anda adalah "Sebulan atau dua pengkodan jika seseorang membelanjakan kira-kira setahun untuk meretas skema keselamatan saya", maka penyelesaian ini adalah untuk anda. Kunci DES tunggal yang digunakan dalam skema penyulitan ini akan memberikan keselamatan yang lebih dari mencukupi untuk kod anda dan tidak memerlukan kompilasi semula kod untuk klien baru.

Saya telah menyediakan dua fail sumber untuk kemudahan anda. Fail pertama "Password_Check" adalah apa yang akan anda tambahkan ke indikator atau penasihat pakar anda. Ia akan mengesahkan kata laluan yang dimasukkan oleh pengguna dalam parameter input "Password" dan jika kata laluan adalah salah (atau jika pengguna tidak dalam talian), ia akan memaparkan mesej mesra pengguna, mengeluarkan penasihat (jika itu yang sedang berjalan) dan mengembalikan status INIT_FAILED.

Fail kedua, "Password_Generate", digunakan untuk memasukkan nama dan nombor akaun klien yang ingin anda lindungi. Ia akan memaparkan kata laluan yang dihasilkan supaya anda boleh memberikan ini kepada klien anda. Sudah tentu, anda tidak mahu memasukkan kod ini dalam produk akhir anda! :)

Jadi, mari kita mulakan...

Pertama, kita perlu mendefinisikan satu rentetan input untuk indikator atau Penasihat Pakar anda:

//--- parameter input
extern string     Password;

Seterusnya, kita tambahkan kod dalam fungsi init() untuk memeriksa kata laluan dan memaparkan mesej jika kata laluan adalah salah, jika pengguna tidak dalam talian, atau jika pengguna tidak memasukkan kata laluan langsung.

//+------------------------------------------------------------------+
//| Fungsi inisialisasi penasihat                                   |
//+------------------------------------------------------------------+
int init()
{
   string   client = NULL;
   
   // Pastikan klien dalam talian untuk mendapatkan nama dan nombor akaun
   if(IsConnected()) client = AccountInfoString(ACCOUNT_NAME) + " / " + DoubleToStr(AccountInfoInteger(ACCOUNT_LOGIN), 0);

   // Semak kata laluan klien
   if(!Password_Check(client))
   {
      if(StringLen(Password) != 0)
         MessageBox("Tidak dapat mengesahkan klien dan nombor akaun!" + 
            (IsConnected() ? "\nSila semak anda mempunyai kata laluan yang betul." : "\n\nAnda perlu dalam talian untuk pengesahan."), 
            (IsConnected() ? "Kata Laluan Tidak Sah!" : "Tidak Dalam Talian!"), MB_OK | MB_ICONSTOP);
      else
         MessageBox("Perisian tidak berdaftar.\n\nSila hubungi vendor perisian untuk mendapatkan\nkata laluan pengaktifan peribadi anda." +
            (StringLen(client) == 0 ? "" : "\n\nMaklumat pendaftaran anda adalah:\n\n'"+client+"'"), 
            "Tidak Berdaftar", MB_OK | MB_ICONSTOP);
      
      // Kata laluan tidak sah atau pengguna tidak dalam talian.  Keluarkan penasihat dan keluar dengan ralat
      ExpertRemove();
      return(INIT_FAILED);
   }

   // Semua baik...
   return(INIT_SUCCEEDED);
}

Kini, mari kita ke bahagian penting... Kita perlu menyulitkan nama klien dan nombor akaun dengan kunci DES kita, menyulitkan hasil ke dalam BASE64 dan membandingkannya dengan kata laluan yang dimasukkan. Jika hasilnya sepadan, anda mempunyai pelanggan yang gembira. Jika tidak, anda mempunyai penggodam yang cuba meretas kunci DES anda. Memandangkan penasihat pakar akan mengeluarkan dirinya setiap kali kata laluan yang salah dimasukkan, anda mungkin mempunyai masa untuk bersara di Bora Bora sebelum mereka berjaya!

//+------------------------------------------------------------------+
//| Sahkan kata laluan klien
//+------------------------------------------------------------------+
bool Password_Check(string client)
{
   string   MasterKey;
   uchar dst[], src[], key[];

   // Definisikan kunci penyulitan anda di sini.  Mesti 7 aksara untuk penyulitan DES/ECB
   // Jadikan kata laluan anda sukar untuk diteka.  Nama belakang anda bukan idea yang baik!
   // Sesuatu seperti "wLdU&$z" adalah baik.  Untuk sekarang, kita akan gunakan yang sederhana...
   MasterKey = "NotDemo";  
   
   // Tukar MasterKey ke dalam array aksara
   StringToCharArray(MasterKey, key);
   
   // Pastikan rentetan klien tidak null
   if(StringLen(client) == 0) return(false);
   
   // Penyulitkan klien menggunakan kunci DES
   StringToCharArray(client, src);
   CryptEncode(CRYPT_DES, src, key, dst);

   // Kosongkan kunci dan kodkan ke BASE64
   ArrayInitialize(key, 0x00);
   CryptEncode(CRYPT_BASE64, dst, key, src);

   // Bandingkan kata laluan dan pulangkan hasil
   return(CharArrayToString(src) == Password);
}

Itu sahaja! Kini kita boleh mengesahkan nama klien (yang diambil dari nama akaun klien MetaTrader 4) serta nombor akaun klien (juga diambil dari MetaTrader 4).

Jika polisi pelesenan anda membenarkan pelbagai akaun untuk seorang klien, maka anda hanya perlu mengeluarkan nombor akaun dari rentetan 'client', seperti berikut:

// Pastikan klien dalam talian untuk mendapatkan nama klien
if(IsConnected()) client = AccountInfoString(ACCOUNT_NAME);

Sudah tentu anda boleh melakukan campuran dan padanan dengan "Nama Broker", "Nama Akaun" dan "Log Masuk Akaun" mengikut cara yang anda lihat sesuai. Hanya ingat bahawa semakin panjang pembolehubah 'client', semakin panjang kata laluan yang disulitkan.

Seterusnya, mari kita lihat kod "Password_Generate". Apa yang kita mahu lakukan adalah sama seperti "Password_Check" tetapi sebaliknya daripada memasukkan kata laluan ke dalam EA, kita ingin memasukkan nama klien (atau gabungan Nama Broker, Nama Akaun dan Log Masuk Akaun yang anda pilih) untuk disulitkan dan kemudian memaparkan kata laluan yang dihasilkan. Ini adalah apa yang akan anda berikan kepada klien anda apabila mereka membeli indikator dan/atau Penasihat Pakar yang hebat anda.

Sekali lagi, dalam fungsi init() anda akan menambah kod berikut.

//+------------------------------------------------------------------+
//| Fungsi inisialisasi penasihat                                   |
//+------------------------------------------------------------------+
int init()
{
   string   Password = NULL;

   // Pastikan input Klien tidak kosong
   if(StringLen(Client) != 0)
   {   
      // Hasilkan kata laluan klien
      Password = Password_Generate(Client);
   
      // Cetak kata laluan yang dihasilkan (memudahkan untuk potong dan tampal)
      Print("Klien: '"+Client+"'  Kata Laluan: "+Password);
      
      // Paparkan kata laluan yang dihasilkan untuk klien
      MessageBox("Kata laluan yang dihasilkan untuk klien / akaun\n\n'"+Client+"' adalah:\n"+Password, "Penjana Kata Laluan", 
         MB_OK | MB_ICONINFORMATION);
   }
   else
      MessageBox("Anda mesti menetapkan klien / nombor akaun!", "Penjana Kata Laluan", MB_OK | MB_ICONSTOP);
         
   // Semua baik.  Keluarkan penasihat.
   ExpertRemove();
   return(INIT_SUCCEEDED);
}

Kini kita melakukan sedikit pengubahsuaian pada fungsi "Password_Check()" untuk mengembalikan rentetan kata laluan yang disulitkan. Ingat untuk menggunakan kata laluan yang sama dalam BOTH fungsi Password_Check() dan Password_Generate(). Anda boleh bayangkan apa yang akan berlaku jika anda tidak!

//+------------------------------------------------------------------+
//| Penyulitkan maklumat klien dan mengembalikan kata laluan
//+------------------------------------------------------------------+
string Password_Generate(string client)
{
   string   MasterKey;
   uchar dst[], src[], key[];

   // Definisikan kunci penyulitan anda di sini.  Mesti 7 aksara untuk penyulitan DES/ECB
   // IA HARUS SAMA DENGAN KATA LALUAN YANG DITENTUKAN DALAM FUNGSI "Password_Check()"!
   // Jadikan kata laluan anda sukar untuk diteka.  Nama belakang anda bukan idea yang baik!
   // Sesuatu seperti "wLdU&$z" adalah baik.  Untuk sekarang, kita akan gunakan yang sederhana...
   MasterKey = "NotDemo";  
   
   // Tukar MasterKey ke dalam array aksara
   StringToCharArray(MasterKey, key);
   
   // Penyulitkan klien menggunakan kunci DES
   StringToCharArray(client, src);
   CryptEncode(CRYPT_DES, src, key, dst);

   // Kosongkan kunci dan kodkan ke BASE64
   ArrayInitialize(key, 0x00);
   CryptEncode(CRYPT_BASE64, dst, key, src);

   // Kembalikan kata laluan yang disulitkan
   return(CharArrayToString(src));   
}

Itu sahaja, itu sahaja. Anda masukkan maklumat yang diberikan kepada anda oleh klien dan anda hantarkan kata laluan kepada mereka melalui email atau cara lain yang anda pilih. Sudah tentu, keindahan ini adalah anda boleh melakukan ini dari ruang tamu anda di Bora Bora!

Seperti yang dinyatakan sebelum ini, skema keselamatan ini tidak memerlukan anda untuk menyusun semula kod anda untuk setiap pelanggan baru atau mengodkan host pengesahan sisi pelayan sambil memberikan keselamatan yang cukup baik untuk kerja keras anda mencipta indikator / Penasihat Pakar yang hebat ini!

Selamat berdagang!

-Claude.

Siaran berkaitan

Komen (0)