Como Proteger Seu Indicador/EA no MetaTrader 4 com Senha

Mike 2016.05.25 22:11 66 0 0
Anexo

Se você é um trader que desenvolve seus próprios indicadores ou Expert Advisors (EAs), sabe que proteger seu código é essencial. Existem várias abordagens para isso, mas muitas vezes são complicadas ou exigem recompilações constantes. Aqui, vou te mostrar um método simples de verificação de senha que utiliza o motor de segurança embutido do MT4, sem a necessidade de recompilar seu código para cada novo cliente.

Com uma experiência em iniciativas de cartões inteligentes no Canadá, aprendi muito sobre esquemas de segurança usados por instituições financeiras. A primeira pergunta que você deve se fazer é: "Qual é o risco?" Se a resposta for "milhões de dólares", talvez este esquema não seja para você. Mas se a sua preocupação é apenas perder algumas horas de programação se alguém hackear seu sistema, então este método pode ser ideal para você.

O esquema de criptografia que proponho utiliza uma chave DES, que oferece segurança adequada e não requer recompilação de código para novos clientes. Vamos começar com a implementação:

1. Definindo a Senha

Primeiro, precisamos definir uma string de entrada para o seu indicador ou EA:

//--- parâmetros de entrada
extern string     Senha;

2. Verificando a Senha

Em seguida, adicione o código na função init() para verificar a senha:

//+------------------------------------------------------------------+
//| Função de inicialização do Expert                                   |
//+------------------------------------------------------------------+
int init()
{
   string   cliente = NULL;

   // Verifique se o cliente está online para obter seu nome e número da conta
   if(IsConnected()) cliente = AccountInfoString(ACCOUNT_NAME) + " / " + DoubleToStr(AccountInfoInteger(ACCOUNT_LOGIN), 0);

   // Verifique a senha do cliente
   if(!Senha_Check(cliente))
   {
      if(StringLen(Senha) != 0)
         MessageBox("Não foi possível verificar o cliente e o número da conta!" +
            (IsConnected() ? "\nVerifique se você tem a senha correta." : "\n\nVocê precisa estar online para a verificação."),
            (IsConnected() ? "Senha Inválida!" : "Offline!"), MB_OK | MB_ICONSTOP);
      else
         MessageBox("Software não registrado.\n\nEntre em contato com o fornecedor do software para obter\nsua senha de ativação pessoal." +
            (StringLen(cliente) == 0 ? "" : "\n\nSuas informações de registro são:\n\n'"+cliente+"'"),
            "Não Registrado", MB_OK | MB_ICONSTOP);

      // Senha inválida ou usuário offline. Remover expert e sair com erro
      ExpertRemove();
      return(INIT_FAILED);
   }

   // Tudo certo...
   return(INIT_SUCCEEDED);
}

3. Validando a Senha do Cliente

Agora, precisamos codificar o nome do cliente e o número da conta com nossa chave DES e comparar com a senha digitada. Se tudo estiver certo, o cliente fica feliz! Se não, pode ser que alguém esteja tentando hackear seu código.

//+------------------------------------------------------------------+
//| Valida a senha do cliente                                        |
//+------------------------------------------------------------------+
bool Senha_Check(string cliente)
{
   string   ChaveMestra;
   uchar dst[], src[], key[];

   // Defina sua chave de criptografia aqui. Deve ter 7 caracteres para criptografia DES/ECB
   ChaveMestra = "NotDemo";
   
   // Converta ChaveMestra em array de caracteres
   StringToCharArray(ChaveMestra, key);
   
   // Verifique se a string do cliente não é nula
   if(StringLen(cliente) == 0) return(false);
   
   // Criptografe o cliente usando a chave DES
   StringToCharArray(cliente, src);
   CryptEncode(CRYPT_DES, src, key, dst);

   // Limpe a chave e codifique para BASE64
   ArrayInitialize(key, 0x00);
   CryptEncode(CRYPT_BASE64, dst, key, src);

   // Compare a senha e retorne o resultado
   return(CharArrayToString(src) == Senha);
}

4. Gerando a Senha

Agora vamos olhar o código de Senha_Generate. O que queremos fazer é o mesmo que no Senha_Check, mas ao invés de digitar uma senha, vamos inserir o nome do cliente para ser criptografado e exibir a senha gerada:

//+------------------------------------------------------------------+
//| Gera senha para o cliente                                         |
//+------------------------------------------------------------------+
string Senha_Generate(string cliente)
{
   string   ChaveMestra;
   uchar dst[], src[], key[];

   // Defina sua chave de criptografia aqui. Deve ter 7 caracteres para DES/ECB
   ChaveMestra = "NotDemo";
   
   // Converta ChaveMestra em array de caracteres
   StringToCharArray(ChaveMestra, key);
   
   // Criptografe o cliente usando a chave DES
   StringToCharArray(cliente, src);
   CryptEncode(CRYPT_DES, src, key, dst);

   // Limpe a chave e codifique para BASE64
   ArrayInitialize(key, 0x00);
   CryptEncode(CRYPT_BASE64, dst, key, src);

   // Retorne a senha criptografada
   return(CharArrayToString(src));
}

Pronto! Agora você pode validar o nome do cliente e o número da conta, além de gerar senhas de forma segura. Essa solução é prática e não exige recompilações, permitindo que você se concentre no que realmente importa: o trading!

Se você tiver mais dúvidas ou quiser compartilhar suas experiências, fique à vontade para comentar abaixo. Boa sorte e até a próxima!

- Seu amigo trader.

Lista
Comentário 0