Accueil Trading Systématique Publication

Protéger votre Indicateur / Expert Advisor avec un Mot de Passe sur MetaTrader 4

Pièce jointe
15534.zip (2.42 KB, Télécharger 0 fois)

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

Commentaire (0)