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.
Comentário 0