欢迎访问 外汇EA下载与MT4/MT5自动交易资源 - 聚合外汇EA、黄金EA、量化交易工具与自动化交易实战内容。
登录 注册

为您的指标/EA 交易添加密码保护 - MetaTrader 4 的 Expert

author emer | 353 人阅读 | 0 人评论 |

过去已经提出了几种保护代码的方法,但要么太简单(安全性较低),需要为每个新客户重新编译代码(如果您只计划拥有十几个左右的客户,也可以),要么太复杂,涉及远程主机来验证客户端。

在这里我提出一个简单的密码验证方案,该方案使用MT4内置的安全引擎提供DES/ECB加密,并且不需要为每个新客户重新编译代码。

在参与了几项备受瞩目的加拿大智能卡计划后,我非常熟悉金融机构和发卡机构使用的各种安全方案。您必须问自己的第一个问题是“有什么风险?”。与这些人一起启动项目时,总是要进行风险评估。如果答案是“数百万美元”,那么这个安全方案不适合您。

另一方面,如果您的答案是“如果有人花费大约一年的时间破解我的安全方案,则需要一两个月的编码”,那么这个解决方案适合您。此加密方案中使用的单个 DES 密钥将为您的代码提供足够的安全性,并且不需要为新客户端重新编译代码。

为了您的方便,我提供了两个源文件。第一个“Password_Check”是您将添加到指标或专家顾问中的内容。它将验证用户在输入参数“Password”中输入的密码,如果密码不正确(或者用户离线),它将显示一条用户友好消息,删除专家(如果正在运行)并返回 INIT_FAILED 状态。

第二个文件“Password_Generate”用于输入要保护的客户名称和帐号。它将显示生成的密码,以便您可以将其提供给您的客户。显然,您不想将此代码包含在您的最终产品中! :)

那么让我们开始吧...

首先,我们需要为您的指标或 Expert Advisor 定义一个输入字符串:

//--- 输入参数
外部的 细绳     密码;

接下来,我们在 init() 函数中添加代码来检查密码,如果密码不正确、用户离线或用户根本没有输入密码,则显示一条消息。

//+------------------------------------------------------------------+
//|验证客户端的密码
//+------------------------------------------------------------------+
布尔值密码_检查(细绳客户)
{
  细绳   万能钥匙;
  乌查尔dst[], src[], 键[];

  // 在这里定义您的加密密钥。  DES/ECB 加密必须为 7 个字符  // 让你的密码难以被破解。  你的姓氏不是一个好主意!  // 像“wLdU&$z”这样的东西会很好。  现在,我们将使用一个简单的...   万能钥匙 =“不是演示”;  
   
  // 将MasterKey转换为字符数组  字符串转字符数组(万能钥匙,钥匙);
   
  // 确保客户端字符串不为空  如果字符串长度(客户)==0返回错误的);
   
  // 使用DES密钥加密客户端  字符串转字符数组(客户端,源代码);
  加密编码加密数据加密标准, src, key, dst);

  // 清除密钥并编码为 BASE64  数组初始化(钥匙,0x00);
  加密编码CRYPT_BASE64、dst、键、src);

  // 比较密码并返回结果  返回字符数组转字符串(src) == 密码);
}

就是这样!我们现在可以验证客户名称(取自 MetaTrader 4 的客户账户名称)以及客户帐号(也取自 MetaTrader 4)。

如果您的许可策略是允许单个客户端使用多个帐户,那么您只需从“client”字符串中删除帐号,如下所示:

// 确保客户端在线以便获取客户端名称
如果已连接()) 客户=帐户信息字符串帐户名称);

当然,您可以按照您认为合适的方式混合搭配“经纪商名称”、“账户名称”和“账户登录”。请记住,“client”变量越长,加密的密码就越长。

接下来,我们看一下“Password_Generate”代码。我们想要做的与“Password_Check”相同,但我们不想在 EA 中输入密码,而是输入要加密的客户名称(或您选择的经纪商名称、账户名称和账户登录名的组合),然后显示生成的密码。这是当您的客户购买您的强大指标和/或 Expert Advisor 时您将提供给他们的东西。

同样,在 init() 函数中,您将添加以下代码。

//+------------------------------------------------------------------+
//|专家初始化函数                                   |
//+------------------------------------------------------------------+
整数初始化()
{
  细绳   密码=无效的;

  // 确保客户端输入不为空  如果字符串长度(客户端)!=0)
   {   
      // 生成客户端密码      密码=Password_Generate(客户端);
   
      // 打印生成的密码(方便剪切和粘贴)      打印“客户: '”+客户+“'  密码: ”+密码);
      
      // 显示为客户端生成的密码      消息框“为客户/帐户生成的密码\n\n'”+客户+“' 是:\n”+密码,“密码生成器”, 
        MB_OK|MB_ICONINFORMATION);
   }
  别的      消息框“您必须指定客户/帐号!”,“密码生成器”,MB_OK|MB_ICONSTOP);
         
  // 一切都好。  删除专家。  专家删除();
  返回初始化成功);
}

现在我们对“Password_Check()”函数进行轻微修改,以返回编码密码的字符串。请记住在Password_Check()函数和Password_Generate()函数中使用相同的密码。你可以想象如果你不这样做会发生什么!

//+------------------------------------------------------------------+
//|加密客户端信息并返回密码
//+------------------------------------------------------------------+
细绳密码_生成(细绳客户)
{
  细绳   万能钥匙;
  乌查尔dst[], src[], 键[];

  // 在这里定义您的加密密钥。  DES/ECB 加密必须为 7 个字符  // 它必须与“Password_Check()”函数中定义的密码相同!  // 让你的密码难以被破解。  你的姓氏不是一个好主意!  // 像“wLdU&$z”这样的东西会很好。  现在,我们将使用一个简单的...   万能钥匙 =“不是演示”;  
   
  // 将MasterKey转换为字符数组  字符串转字符数组(万能钥匙,钥匙);
   
  // 使用DES密钥加密客户端  字符串转字符数组(客户端,源代码);
  加密编码加密数据加密标准, src, key, dst);

  // 清除密钥并编码为 BASE64  数组初始化(钥匙,0x00);
  加密编码CRYPT_BASE64、dst、键、src);

  // 返回加密后的密码  返回字符数组转字符串(来源));   
}

就这样,就这样了。您输入客户提供给您的信息,然后通过电子邮件或您选择的任何其他方式向他们发送密码。当然,这样做的美妙之处在于您可以在波拉波拉岛的客厅里做到这一点!

如前所述,此安全方案不需要您为每个新客户重新编译代码或编写服务器端验证主机,同时为您创建强大的指标/EA 交易的辛勤工作提供相当好的安全性!


附件下载

📎 password_check.mq4 (3.58 KB)

📎 password_generate.mq4 (3.22 KB)

Source: MQL5 #15534

🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录