Salut les traders ! Aujourd'hui, je vais vous parler d'une méthode simple pour protéger votre code d'Indicateur ou d'Expert Advisor sur MetaTrader 4. Vous savez, il existe plusieurs méthodes pour sécuriser votre code, mais beaucoup sont soit trop simples, soit nécessitent une recompilation à chaque nouveau client, ce qui est fastidieux si vous avez plus qu'une poignée de clients.
Je vous propose donc un système de vérification de mot de passe qui utilise le moteur de sécurité intégré de MT4, offrant un chiffrement DES/ECB, sans nécessiter de recompilation pour chaque nouveau client. Pratique, non ?
Ayant travaillé sur plusieurs projets de cartes intelligentes au Canada, j'ai appris à connaître les différents systèmes de sécurité utilisés par les institutions financières. La première question à se poser est : "Quels sont les risques ?" Si la réponse est "Des millions de dollars", alors ce système n'est pas pour vous. Mais si vous pensez que le risque se limite à quelques mois de code si quelqu'un tente de pirater votre système, alors cette solution est faite pour vous !
Le chiffrement avec une clé DES unique offrira une sécurité plus que suffisante pour votre code, et ne nécessitera pas de recompilation pour de nouveaux clients.
Pour vous faciliter la tâche, j'ai préparé deux fichiers source. Le premier, Password_Check, est ce que vous allez ajouter à votre indicateur ou Expert Advisor. Il vérifiera le mot de passe saisi par l'utilisateur dans le paramètre d'entrée Password. Si le mot de passe est incorrect ou si l'utilisateur est hors ligne, un message convivial s'affichera, retirant l'expert (si c'est ce qui est en cours) et renvoyant un statut INIT_FAILED.
Le deuxième fichier, Password_Generate, est utilisé pour entrer le nom et le numéro de compte du client que vous souhaitez protéger. Il affichera le mot de passe généré afin que vous puissiez le transmettre à vos clients. Bien sûr, vous ne voulez pas inclure ce code dans votre produit final !
Alors, commençons !
Définir une chaîne d'entrée pour votre Indicateur ou Expert Advisor
//--- paramètres d'entrée extern string Password;
Ensuite, ajoutons du code dans la fonction init() pour vérifier le mot de passe et afficher un message si celui-ci est incorrect, si l'utilisateur est hors ligne ou s'il n'a tout simplement pas saisi de mot de passe.
//+------------------------------------------------------------------+ //| Fonction d'initialisation de l'expert | //+------------------------------------------------------------------+ int init() { string client = NULL; // Assurez-vous que le client est en ligne pour obtenir son nom et son numéro de compte if(IsConnected()) client = AccountInfoString(ACCOUNT_NAME) + " / " + DoubleToStr(AccountInfoInteger(ACCOUNT_LOGIN), 0); // Vérifiez le mot de passe du client if(!Password_Check(client)) { if(StringLen(Password) != 0) MessageBox("Impossible de vérifier le client et le numéro de compte !" + (IsConnected() ? " Veuillez vérifier que vous avez le bon mot de passe." : " Vous devez être en ligne pour la vérification."), (IsConnected() ? "Mot de passe invalide !" : "Hors ligne !"), MB_OK | MB_ICONSTOP); else MessageBox("Logiciel non enregistré. Veuillez contacter le fournisseur de logiciels pour obtenir votre mot de passe d'activation personnel." + (StringLen(client) == 0 ? "" : " Vos informations d'enregistrement sont : '"+client+"'"), "Non enregistré", MB_OK | MB_ICONSTOP); // Mot de passe invalide ou utilisateur hors ligne. Retirez l'expert et sortez avec une erreur ExpertRemove(); return(INIT_FAILED); } // Tout va bien... return(INIT_SUCCEEDED); }
Maintenant, passons à la suite... Nous devons encoder le nom et le numéro de compte du client avec notre clé DES, encoder le résultat en BASE64 et le comparer avec le mot de passe saisi. Si le résultat correspond, vous avez un client satisfait. Dans le cas contraire, vous avez un hacker qui essaie de craquer votre clé DES. Étant donné que l'expert advisor se déchargera chaque fois qu'un mauvais mot de passe est saisi, vous aurez probablement le temps de prendre votre retraite à Bora Bora avant qu'il ne réussisse !
//+------------------------------------------------------------------+ //| Valider le mot de passe du client //+------------------------------------------------------------------+ bool Password_Check(string client) { string MasterKey; uchar dst[], src[], key[]; // Définissez votre clé de chiffrement ici. Doit comporter 7 caractères pour le chiffrement DES/ECB // Rendez votre mot de passe difficile à deviner. Votre nom de famille n'est pas une bonne idée ! // Quelque chose comme "wLdU&$z" serait bon. Pour l'instant, nous allons utiliser un simple... MasterKey = "NotDemo"; // Convertir MasterKey en tableau de caractères StringToCharArray(MasterKey, key); // Assurez-vous que la chaîne client n'est pas nulle if(StringLen(client) == 0) return(false); // Chiffrez le client en utilisant la clé DES StringToCharArray(client, src); CryptEncode(CRYPT_DES, src, key, dst); // Effacer la clé et encoder en BASE64 ArrayInitialize(key, 0x00); CryptEncode(CRYPT_BASE64, dst, key, src); // Comparer le mot de passe et renvoyer le résultat return(CharArrayToString(src) == Password); }
C'est tout ! Nous pouvons maintenant valider le nom du client (tel qu'il est pris à partir du nom de compte client de MetaTrader 4) ainsi que le numéro de compte du client (également pris à partir de MetaTrader 4).
Si votre politique de licence permet plusieurs comptes pour un même client, il vous suffit de retirer le numéro de compte de la chaîne client, comme suit :
// Assurez-vous que le client est en ligne pour obtenir le nom du client if(IsConnected()) client = AccountInfoString(ACCOUNT_NAME);
Bien sûr, vous pouvez faire un mélange de "Nom de Courtier", "Nom de Compte" et "Identifiant de Compte" comme bon vous semble. Rappelez-vous simplement que plus la variable client est longue, plus le mot de passe chiffré sera long.
Ensuite, jetons un œil au code Password_Generate. Ce que nous voulons faire est la même chose que pour Password_Check, mais au lieu de saisir un mot de passe dans l'EA, nous souhaitons entrer le nom du client (ou une combinaison de nom de courtier, nom de compte et identifiant de compte de votre choix) à chiffrer et afficher le mot de passe généré. C'est ce que vous donnerez à vos clients lorsqu'ils achèteront votre super indicateur ou Expert Advisor.
Encore une fois, dans votre fonction init(), vous ajouterez le code suivant.
//+------------------------------------------------------------------+ //| Fonction d'initialisation de l'expert | //+------------------------------------------------------------------+ int init() { string Password = NULL; // Assurez-vous que l'entrée du client n'est pas vide if(StringLen(Client) != 0) { // Générer un mot de passe client Password = Password_Generate(Client); // Afficher le mot de passe généré (facile à copier-coller) Print("Client : '"+Client+"' Mot de passe : "+Password); // Afficher le mot de passe généré pour le client MessageBox("Mot de passe généré pour le client / compte '"+Client+"' est : "+Password, "Générateur de Mot de Passe", MB_OK | MB_ICONINFORMATION); } else MessageBox("Vous devez spécifier un client / numéro de compte !", "Générateur de Mot de Passe", MB_OK | MB_ICONSTOP); // Tout va bien. Retirez l'expert. ExpertRemove(); return(INIT_SUCCEEDED); }
Maintenant, nous apportons une légère modification à notre fonction Password_Check() pour renvoyer une chaîne du mot de passe encodé. N'oubliez pas d'utiliser le même mot de passe dans les deux fonctions Password_Check() et Password_Generate(). Vous pouvez imaginer ce qui se passera si vous ne le faites pas !
//+------------------------------------------------------------------+ //| Chiffrez les informations du client et renvoyez le mot de passe //+------------------------------------------------------------------+ string Password_Generate(string client) { string MasterKey; uchar dst[], src[], key[]; // Définissez votre clé de chiffrement ici. Doit comporter 7 caractères pour le chiffrement DES/ECB // CELA DOIT ÊTRE LE MÊME MOT DE PASSE QUE DÉFINI DANS LA FONCTION "Password_Check()" ! // Rendez votre mot de passe difficile à deviner. Votre nom de famille n'est pas une bonne idée ! // Quelque chose comme "wLdU&$z" serait bon. Pour l'instant, nous allons utiliser un simple... MasterKey = "NotDemo"; // Convertir MasterKey en tableau de caractères StringToCharArray(MasterKey, key); // Chiffrez le client en utilisant la clé DES StringToCharArray(client, src); CryptEncode(CRYPT_DES, src, key, dst); // Effacer la clé et encoder en BASE64 ArrayInitialize(key, 0x00); CryptEncode(CRYPT_BASE64, dst, key, src); // Retourner le mot de passe crypté return(CharArrayToString(src)); }
C'est tout, c'est fini. Vous entrez les informations fournies par votre client et vous leur envoyez le mot de passe par email ou tout autre moyen de votre choix. Bien sûr, l'avantage de cela, c'est que vous pouvez le faire depuis votre salon à Bora Bora !
Comme mentionné précédemment, ce schéma de sécurité ne nécessite pas de recompilation de votre code pour chaque nouveau client ni de coder un hôte de validation côté serveur, tout en offrant une sécurité satisfaisante pour votre travail acharné à créer cet indicateur / Expert Advisor incroyable !
À la vôtre !
-Claude.
Articles connexes
- Utiliser MQL5 Wizard pour Créer un Expert Advisor Basé sur les Modèles de Chandeliers Englobants et MFI
- Développez un Expert Advisor avec MQL5 : Signaux de Trading 3 Corbeaux Noirs / 3 Soldats Blancs + RSI
- Découvrez l'Expert Advisor exp_iCustom_v5 pour MetaTrader 4
- Découvrez le Système de Trading Exp_XPeriodCandle_X2 pour MetaTrader 5
- Découvrez CoensioTrader1V06 : Votre nouvel allié sur MetaTrader 5