Startseite Systemhandel Beitrag

Passwortschutz für Ihre Indikatoren und Expert Advisors in MetaTrader 4

Anhang
15534.zip (2.42 KB, Herunterladen 0 mal)

In der Vergangenheit wurden verschiedene Methoden zum Schutz Ihres Codes vorgeschlagen, aber viele waren entweder zu einfach (weniger sicher), erforderten eine Neukompilierung Ihres Codes für jeden neuen Kunden (was in Ordnung ist, wenn Sie nur ein Dutzend Kunden haben) oder waren viel zu kompliziert und beinhalteten einen Remote-Host zur Validierung des Client-Terminals.

Hier möchte ich ein einfaches Passwort-Verifizierungssystem vorstellen, das die integrierte Sicherheitsengine von MT4 nutzt und eine DES/ECB-Verschlüsselung bereitstellt, ohne dass eine Neukompilierung des Codes für jeden neuen Kunden erforderlich ist.

Nachdem ich an mehreren hochkarätigen kanadischen Smartcard-Initiativen gearbeitet habe, bin ich mit den verschiedenen Sicherheitskonzepten, die von Finanzinstituten und Kartenherausgebern verwendet werden, gut vertraut. Die erste Frage, die Sie sich stellen müssen, ist: "Was steht auf dem Spiel?" Eine Risikoanalyse wird immer durchgeführt, wenn man mit diesen Leuten ein Projekt startet. Wenn die Antwort "Millionen von Dollars" lautet, dann ist dieses Sicherheitskonzept nicht für Sie.

Wenn Ihre Antwort jedoch "Ein Monat oder zwei Programmierung, falls jemand etwa ein Jahr damit verbringt, mein Sicherheitskonzept zu hacken" lautet, dann ist diese Lösung genau das Richtige für Sie. Der verwendete DES-Schlüssel in diesem Verschlüsselungsschema bietet mehr als ausreichende Sicherheit für Ihren Code und erfordert keine Neukompilierung für neue Kunden.

Ich habe zwei Quelldateien für Ihre Bequemlichkeit bereitgestellt. Die erste Datei "Password_Check" ist das, was Sie zu Ihrem Indikator oder Expert Advisor hinzufügen werden. Sie überprüft das vom Benutzer eingegebene Passwort im Eingabeparameter "Password" und zeigt eine benutzerfreundliche Nachricht an, wenn das Passwort falsch ist (oder wenn der Benutzer offline ist), entfernt das Expert (falls das gerade läuft) und gibt den Status INIT_FAILED zurück.

Die zweite Datei, "Password_Generate", wird verwendet, um den Namen des Kunden und die Kontonummer einzugeben, die Sie schützen möchten. Sie zeigt das generierte Passwort an, das Sie Ihren Kunden zur Verfügung stellen können. Offensichtlich möchten Sie diesen Code nicht in Ihr Endprodukt aufnehmen! :)

Also, lassen Sie uns anfangen...

Zuerst müssen wir eine Eingabezeichenfolge für Ihren Indikator oder Expert Advisor definieren:

//--- Eingabeparameter
extern string     Password;

Als Nächstes fügen wir im init()-Funktion Code hinzu, um das Passwort zu überprüfen und eine Nachricht anzuzeigen, wenn das Passwort falsch ist, wenn der Benutzer offline ist oder wenn der Benutzer einfach kein Passwort eingegeben hat.

//+------------------------------------------------------------------+
//| Expert-Initialisierungsfunktion                                   |
//+------------------------------------------------------------------+
int init()
{
   string   client = NULL;
   
   // Stellen Sie sicher, dass der Kunde online ist, um seinen Namen und die Kontonummer zu erhalten
   if(IsConnected()) client = AccountInfoString(ACCOUNT_NAME) + " / " + DoubleToStr(AccountInfoInteger(ACCOUNT_LOGIN), 0);

   // Überprüfen Sie das Passwort des Kunden
   if(!Password_Check(client))
   {
      if(StringLen(Password) != 0)
         MessageBox("Unfähig, Kunden- und Kontonummer zu überprüfen!" + 
            (IsConnected() ? "\nBitte überprüfen Sie, ob Sie das richtige Passwort haben." : "\n\nSie müssen online sein, um die Überprüfung durchzuführen."), 
            (IsConnected() ? "Ungültiges Passwort!" : "Offline!"), MB_OK | MB_ICONSTOP);
      else
         MessageBox("Unregistrierte Software.\n\nBitte kontaktieren Sie den Softwareanbieter, um\nein persönliches Aktivierungspasswort zu erhalten." +
            (StringLen(client) == 0 ? "" : "\n\nIhre Registrierungsinformationen sind:\n\n'"+client+"'"), 
            "Unregistriert", MB_OK | MB_ICONSTOP);
      
      // Ungültiges Passwort oder Benutzer ist offline. Entfernen Sie das Expert und verlassen Sie mit Fehler
      ExpertRemove();
      return(INIT_FAILED);
   }

   // Alles gut...
   return(INIT_SUCCEEDED);
}

Jetzt kommt der spannende Teil... Wir müssen den Kundennamen und die Kontonummer mit unserem DES-Schlüssel codieren, das Ergebnis in BASE64 codieren und mit dem eingegebenen Passwort vergleichen. Wenn das Ergebnis übereinstimmt, haben Sie einen zufriedenen Kunden. Wenn nicht, haben Sie einen Hacker, der versucht, Ihren DES-Schlüssel zu knacken. Angesichts der Tatsache, dass der Expert Advisor sich selbst beendet, jedes Mal, wenn ein falsches Passwort eingegeben wird, haben Sie wahrscheinlich Zeit, in Bora Bora in den Ruhestand zu gehen, bevor sie Erfolg haben!

//+------------------------------------------------------------------+
//| Validierung des Passworts des Kunden
//+------------------------------------------------------------------+
bool Password_Check(string client)
{
   string   MasterKey;
   uchar dst[], src[], key[];

   // Definieren Sie hier Ihren Verschlüsselungsschlüssel. Muss 7 Zeichen für DES/ECB-Verschlüsselung sein
   // Machen Sie Ihr Passwort schwer zu erraten. Ihr Nachname ist keine gute Idee!
   // Etwas wie "wLdU&$z" wäre gut. Für den Anfang verwenden wir ein einfaches...
   MasterKey = "NotDemo";  
   
   // Konvertieren Sie MasterKey in ein Zeichenarray
   StringToCharArray(MasterKey, key);
   
   // Stellen Sie sicher, dass die Kundenzeichenfolge nicht null ist
   if(StringLen(client) == 0) return(false);
   
   // Verschlüsseln Sie den Kunden mit dem DES-Schlüssel
   StringToCharArray(client, src);
   CryptEncode(CRYPT_DES, src, key, dst);

   // Löschen Sie den Schlüssel und kodieren Sie in BASE64
   ArrayInitialize(key, 0x00);
   CryptEncode(CRYPT_BASE64, dst, key, src);

   // Vergleichen Sie das Passwort und geben Sie das Ergebnis zurück
   return(CharArrayToString(src) == Password);
}

Das war's! Wir können jetzt den Kundennamen (wie von MetaTrader 4's Kundenkontonamen übernommen) und die Kontonummer (ebenfalls von MetaTrader 4) validieren.

Wenn Ihre Lizenzpolitik es zulässt, mehrere Konten für einen einzelnen Kunden zu erlauben, müssen Sie nur die Kontonummer aus der 'client'-Zeichenfolge entfernen, wie folgt:

// Stellen Sie sicher, dass der Kunde online ist, um den Kundennamen zu erhalten
if(IsConnected()) client = AccountInfoString(ACCOUNT_NAME);

Natürlich können Sie eine Kombination aus "Broker Name", "Account Name" und "Account Login" nach Belieben verwenden. Denken Sie nur daran, dass je länger die 'client'-Variable ist, desto länger das verschlüsselte Passwort sein wird.

Als Nächstes schauen wir uns den Code "Password_Generate" an. Was wir tun möchten, ist dasselbe wie bei "Password_Check", aber anstatt ein Passwort in die EA einzugeben, möchten wir den Kundennamen (oder die Kombination aus Broker Name, Account Name und Account Login, die Sie wählen) eingeben, um verschlüsselt zu werden, und dann das generierte Passwort anzeigen. Dies ist das, was Sie Ihren Kunden geben, wenn sie Ihren großartigen Indikator und/oder Expert Advisor kaufen.

Nochmals, in Ihrer init()-Funktion fügen Sie den folgenden Code hinzu.

//+------------------------------------------------------------------+
//| Expert-Initialisierungsfunktion                                   |
//+------------------------------------------------------------------+
int init()
{
   string   Password = NULL;

   // Stellen Sie sicher, dass die Kundenangabe nicht leer ist
   if(StringLen(Client) != 0)
   {   
      // Generieren Sie ein Kundenpasswort
      Password = Password_Generate(Client);
   
      // Drucken Sie das generierte Passwort (macht es einfach zu kopieren und einzufügen)
      Print("Kunde: '"+Client+"'  Passwort: "+Password);
      
      // Zeigen Sie das generierte Passwort für den Kunden an
      MessageBox("Passwort generiert für Kunde / Konto\n\n'"+Client+"' ist:\n"+Password, "Passwort-Generator", 
         MB_OK | MB_ICONINFORMATION);
   }
   else
      MessageBox("Sie müssen einen Kunden / Kontonummer angeben!", "Passwort-Generator", MB_OK | MB_ICONSTOP);
         
   // Alles gut. Entfernen Sie das Expert.
   ExpertRemove();
   return(INIT_SUCCEEDED);
}

Jetzt nehmen wir eine kleine Modifikation an unserer Funktion "Password_Check()", um eine Zeichenfolge des kodierten Passworts zurückzugeben. Denken Sie daran, dass Sie dasselbe Passwort sowohl in der Funktion Password_Check() als auch in der Funktion Password_Generate() verwenden müssen. Sie können sich vorstellen, was passiert, wenn Sie das nicht tun!

//+------------------------------------------------------------------+
//| Verschlüsseln Sie die Kundeninformationen und geben Sie das Passwort zurück
//+------------------------------------------------------------------+
string Password_Generate(string client)
{
   string   MasterKey;
   uchar dst[], src[], key[];

   // Definieren Sie hier Ihren Verschlüsselungsschlüssel. Muss 7 Zeichen für DES/ECB-Verschlüsselung sein
   // ES MUSS DAS GLEICHE PASSWORT SEIN, WIE ES IN DER "Password_Check()"-Funktion DEFINIERT IST!
   // Machen Sie Ihr Passwort schwer zu erraten. Ihr Nachname ist keine gute Idee!
   // Etwas wie "wLdU&$z" wäre gut. Für den Anfang verwenden wir ein einfaches...
   MasterKey = "NotDemo";  
   
   // Konvertieren Sie MasterKey in ein Zeichenarray
   StringToCharArray(MasterKey, key);
   
   // Verschlüsseln Sie den Kunden mit dem DES-Schlüssel
   StringToCharArray(client, src);
   CryptEncode(CRYPT_DES, src, key, dst);

   // Löschen Sie den Schlüssel und kodieren Sie in BASE64
   ArrayInitialize(key, 0x00);
   CryptEncode(CRYPT_BASE64, dst, key, src);

   // Geben Sie das verschlüsselte Passwort zurück
   return(CharArrayToString(src));   
}

Das war's, das ist alles. Sie geben die Informationen ein, die Ihnen von Ihrem Kunden zur Verfügung gestellt wurden, und senden ihnen das Passwort per E-Mail oder auf einem anderen von Ihnen gewählten Weg. Natürlich ist das Schöne daran, dass Sie dies von Ihrem Wohnzimmer in Bora Bora aus erledigen können!

Wie bereits gesagt, erfordert dieses Sicherheitskonzept keine Neukompilierung Ihres Codes für jeden neuen Kunden oder das Programmieren eines serverseitigen Validierungs-Hosts, während es dennoch einen guten Schutz für Ihre harte Arbeit beim Erstellen dieses großartigen Indikators / Expert Advisors bietet!

Prost!

-Claude.

Verwandte Beiträge

Kommentar (0)