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
- MQL5 Wizard: Cipta Sistem Trading Berdasarkan Pola Morning/Evening Star dan RSI
- Panduan Lengkap MQL5 Wizard untuk Isyarat Dagangan Berdasarkan Morning/Evening Stars dan Stochastic
- MQL5 Wizard: Cipta Isyarat Dagangan Menggunakan Corak Morning/Evening Star dan MFI
- MQL5 Wizard: Cipta Isyarat Dagangan Berdasarkan Corak Hammer/Hanging Man dan Stochastic
- Menggunakan MQL5 Wizard untuk Signal Perdagangan '3 Black Crows/3 White Soldiers' + RSI