Beranda Perdagangan Sistem Postingan

Cara Menambahkan Perlindungan Password pada Indikator atau EA di MetaTrader 4

Lampiran
15534.zip (2.42 KB, Unduh 2 kali)

Seiring waktu, telah banyak metode yang diusulkan untuk melindungi kode Anda. Namun, sebagian besar terlalu sederhana (kurang aman), memerlukan kompilasi ulang untuk setiap pelanggan baru (oke jika Anda hanya memiliki belasan pelanggan) atau terlalu rumit dengan melibatkan host jarak jauh untuk memvalidasi terminal klien.

Di sini, saya akan mengusulkan skema verifikasi password sederhana yang memanfaatkan mesin keamanan bawaan MT4 yang menyediakan enkripsi DES/ECB dan tidak memerlukan kompilasi ulang kode untuk setiap pelanggan baru.

Setelah bekerja pada beberapa inisiatif kartu pintar di Kanada yang cukup terkenal, saya menjadi sangat akrab dengan berbagai skema keamanan yang digunakan oleh lembaga keuangan dan penerbit kartu. Pertanyaan pertama yang harus Anda tanyakan pada diri sendiri adalah, "Apa yang dipertaruhkan?" Penilaian risiko selalu dilakukan saat memulai proyek dengan mereka. Jika jawabannya adalah "Jutaan dolar", maka skema keamanan ini bukan untuk Anda.

Namun, jika jawaban Anda adalah "Satu atau dua bulan coding jika seseorang menghabiskan sekitar setahun untuk meretas skema keamanan saya", maka solusi ini cocok untuk Anda. Kunci DES tunggal yang digunakan dalam skema enkripsi ini akan memberikan keamanan yang lebih dari cukup untuk kode Anda dan tidak akan memerlukan kompilasi ulang kode untuk klien baru.

Saya telah menyediakan dua file sumber untuk kenyamanan Anda. Yang pertama "Password_Check" adalah yang akan Anda tambahkan ke indikator atau EA Anda. Ini akan memverifikasi password yang dimasukkan pengguna pada parameter input "Password" dan jika password salah (atau jika pengguna offline), itu akan menampilkan pesan yang ramah, menghapus EA (jika itu yang sedang berjalan), dan mengembalikan status INIT_FAILED.

File kedua, "Password_Generate", digunakan untuk memasukkan nama dan nomor akun klien yang ingin Anda lindungi. Ini akan menampilkan password yang dihasilkan sehingga Anda dapat memberikannya kepada klien Anda. Tentu saja, Anda tidak ingin menyertakan kode ini dalam produk akhir Anda! :)

Jadi, mari kita mulai...

Pertama, kita perlu mendefinisikan string input untuk indikator atau EA Anda:

//--- parameter input
extern string     Password;

Selanjutnya, kita tambahkan kode di fungsi init() untuk memeriksa password dan menampilkan pesan jika password salah, jika pengguna offline, atau jika pengguna tidak memasukkan password.

//+------------------------------------------------------------------+
//| Fungsi inisialisasi EA                                   |
//+------------------------------------------------------------------+
int init()
{
   string   client = NULL;
   
   // Pastikan klien online untuk mendapatkan nama dan nomor akunnya
   if(IsConnected()) client = AccountInfoString(ACCOUNT_NAME) + " / " + DoubleToStr(AccountInfoInteger(ACCOUNT_LOGIN), 0);

   // Periksa password klien
   if(!Password_Check(client))
   {
      if(StringLen(Password) != 0)
         MessageBox("Tidak dapat memverifikasi nama klien dan nomor akun!" + 
            (IsConnected() ? "
Silakan verifikasi Anda memiliki password yang benar." : "

Anda perlu online untuk verifikasi."), 
            (IsConnected() ? "Password Tidak Valid!" : "Offline!"), MB_OK | MB_ICONSTOP);
      else
         MessageBox("Software belum terdaftar.

Silakan hubungi vendor perangkat lunak untuk mendapatkan
password aktivasi pribadi Anda." +
            (StringLen(client) == 0 ? "" : "

Informasi pendaftaran Anda adalah:

'"+client+"'"), 
            "Belum Terdaftar", MB_OK | MB_ICONSTOP);
      
      // Password tidak valid atau pengguna offline. Hapus EA dan keluar dengan kesalahan
      ExpertRemove();
      return(INIT_FAILED);
   }

   // Semuanya baik-baik saja...
   return(INIT_SUCCEEDED);
}

Selanjutnya, kita perlu mengenkripsi nama klien dan nomor akun dengan kunci DES kita, mengenkripsi hasilnya ke BASE64 dan membandingkannya dengan password yang dimasukkan. Jika hasilnya cocok, Anda memiliki pelanggan yang bahagia. Jika tidak, Anda memiliki peretas yang berusaha meretas kunci DES Anda. Mengingat bahwa EA akan menghapus dirinya sendiri setiap kali password yang salah dimasukkan, Anda mungkin akan memiliki waktu untuk pensiun di Bora Bora sebelum mereka berhasil!

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

   // Definisikan kunci enkripsi Anda di sini. Harus 7 karakter untuk enkripsi DES/ECB
   // Buat password Anda sulit untuk ditebak. Nama belakang Anda bukan pilihan yang baik!
   // Sesuatu seperti "wLdU&$z" akan baik. Untuk saat ini, kita akan menggunakan yang sederhana...
   MasterKey = "NotDemo";  
   
   // Konversi MasterKey ke array karakter
   StringToCharArray(MasterKey, key);
   
   // Pastikan string klien tidak null
   if(StringLen(client) == 0) return(false);
   
   // Enkripsi klien menggunakan kunci DES
   StringToCharArray(client, src);
   CryptEncode(CRYPT_DES, src, key, dst);

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

   // Bandingkan password dan kembalikan hasil
   return(CharArrayToString(src) == Password);
}

Itu dia! Sekarang kita bisa memvalidasi nama klien (diambil dari nama akun klien MetaTrader 4) ditambah nomor akun klien (juga diambil dari MetaTrader 4).

Jika kebijakan lisensi Anda memungkinkan beberapa akun untuk satu klien, maka Anda hanya perlu menghapus nomor akun dari string 'client', seperti berikut:

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

Tentu saja, Anda bisa melakukan campuran dengan "Nama Broker", "Nama Akun" dan "Login Akun" sesuai keinginan Anda. Ingatlah bahwa semakin panjang variabel 'client', semakin panjang password terenkripsi akan menjadi.

Selanjutnya, mari kita lihat kode "Password_Generate". Apa yang ingin kita lakukan sama seperti "Password_Check" tetapi alih-alih memasukkan password ke dalam EA, kita ingin memasukkan nama klien (atau kombinasi Nama Broker, Nama Akun, dan Login Akun yang Anda pilih) untuk dienkripsi dan kemudian menampilkan password yang dihasilkan. Ini adalah apa yang akan Anda berikan kepada klien Anda saat mereka membeli indikator atau EA Anda yang keren itu.

Lagi-lagi, di fungsi init() Anda akan menambahkan kode berikut.

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

   // Pastikan input Klien tidak kosong
   if(StringLen(Client) != 0)
   {   
      // Hasilkan password klien
      Password = Password_Generate(Client);
   
      // Cetak password yang dihasilkan (memudahkan untuk dipotong dan ditempel)
      Print("Klien: '"+Client+"'  Password: "+Password);
      
      // Tampilkan password yang dihasilkan untuk klien
      MessageBox("Password yang dihasilkan untuk klien / akun

'"+Client+"' adalah:
"+Password, "Password Generator", 
         MB_OK | MB_ICONINFORMATION);
   }
   else
      MessageBox("Anda harus menentukan klien / nomor akun!", "Password Generator", MB_OK | MB_ICONSTOP);
         
   // Semuanya baik. Hapus EA.
   ExpertRemove();
   return(INIT_SUCCEEDED);
}

Sekarang kita melakukan sedikit modifikasi pada fungsi "Password_Check()" untuk mengembalikan string dari password yang terenkripsi. Ingat untuk menggunakan password yang sama di BAHWA fungsi Password_Check() dan Password_Generate()! Anda bisa membayangkan apa yang akan terjadi jika Anda tidak melakukannya!

//+------------------------------------------------------------------+
//| Enkripsi informasi klien dan kembalikan password
//+------------------------------------------------------------------+
string Password_Generate(string client)
{
   string   MasterKey;
   uchar dst[], src[], key[];

   // Definisikan kunci enkripsi Anda di sini. Harus 7 karakter untuk enkripsi DES/ECB
   // KUNCINYA HARUS SAMA DENGAN PASSWORD YANG DITENTUKAN DI FUNGSI "Password_Check()"!
   // Buat password Anda sulit untuk ditebak. Nama belakang Anda bukan pilihan yang baik!
   // Sesuatu seperti "wLdU&$z" akan baik. Untuk saat ini, kita akan menggunakan yang sederhana...
   MasterKey = "NotDemo";  
   
   // Konversi MasterKey ke array karakter
   StringToCharArray(MasterKey, key);
   
   // Enkripsi klien menggunakan kunci DES
   StringToCharArray(client, src);
   CryptEncode(CRYPT_DES, src, key, dst);

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

   // Kembalikan password terenkripsi
   return(CharArrayToString(src));   
}

Itu saja, itu semua. Anda memasukkan informasi yang diberikan oleh klien Anda dan mengirimkan password kepada mereka melalui email atau cara lain yang Anda pilih. Tentu saja, keindahan dari ini adalah Anda dapat melakukannya dari ruang tamu Anda di Bora Bora!

Seperti yang dinyatakan sebelumnya, skema keamanan ini tidak memerlukan Anda untuk mengompilasi ulang kode Anda untuk setiap pelanggan baru atau memprogram host validasi sisi server sambil memberikan keamanan yang cukup baik untuk kerja keras Anda menciptakan indikator / EA keren Anda!

Salam!

-Claude.

Postingan terkait

Komentar (0)