首页 / 交易学院 / 给 EA 上锁:MQL5 代码保护的五种套路(密码/密钥/账户/时限/远程许可)
给 EA 上锁:MQL5 代码保护的五种套路(密码/密钥/账户/时限/远程许可)
🔐

给 EA 上锁:MQL5 代码保护的五种套路(密码/密钥/账户/时限/远程许可)

MQL5 编程 难度 · 进阶 2011 14 分钟阅读
代码保护密码保护密钥生成器许可证远程授权base64

开发者辛辛苦苦写的 EA/指标,一旦发出去就可能被随意复制。MQL5 提供多层防护,从最朴素的密码框到远程许可服务器,强度递增。本文按“由浅入深”的顺序拆了五种:密码保护、密钥生成器、账户绑定、时间限制、远程许可证,并给出用 XML-RPC(承接前文 MQL5-RPC 框架)实现服务器校验的思路,最后用 base64 与 PGP 进一步加固。

一、密码保护:最朴素的门禁

最常用也最简单的是密码/序列号保护:首次运行时弹一个输入框(CChartObjectEdit),用户输入与内置 allowed_passwords 数组匹配的代码才放行。密码在 OnChartEvent 收到 CHARTEVENT_OBJECT_ENDEDIT 后校验。这种方案适合“一人一码”的轻量分发,但密码写死在代码里、逆向极易提取,只能挡住普通用户。

// 密码保护存根(节选)
#include <ChartObjects/ChartObjectsTxtControls.mqh>
CChartObjectEdit password_edit;
const string allowed_passwords[] = {
   "863H-6738725-JG76364",
   "145G-8927523-JG76364",
   "263H-7663233-JG76364"
 };
int password_status = -1;
// 在 OnChartEvent 收到 CHARTEVENT_OBJECT_ENDEDIT 时校验输入

二、密钥生成器:按规则批量发码

与其维护一长串写死密码,不如用“规则”生成合法密钥。示例规则:密钥格式 XXXXX-XXXXX-XXXXX(三组数字用连字符分隔),第一组必须被 3 整除、第二组被 4 整除、第三组被 5 整除——于是 3-4-5、18000-20000-20000 都是合法码。这样你只需分发“生成器逻辑”或按规则批量造码,校验时按规则判断即可,比穷举密码优雅。

实务建议:纯前端规则校验仍可被逆向还原规则。真要防盗,密钥应由“服务端按你的私钥签名”生成,EA 用公钥验签——规则式密钥生成器只是教学级方案,适合内部或低风险分发。

三、账户绑定:锁死经纪商与账号

更高一档是绑定运行环境:用 AccountInfoString/AccountInfoInteger 读取经纪商名和账户号,只有匹配 allowed_broker / 允许的 account_number 才运行。这样即使密钥泄露,换台账户也跑不起来。它适合“卖给指定客户、按账户授权”的商业场景,配合密码使用更稳。

四、时间限制:给授权设有效期

时间限制让试用版/租赁版可控:在 EA 里记录一个到期时间(或起始时间 + 时长),每次运行用 TimeCurrent 比对,超期就禁止交易。它常和账户绑定组合,做成“某账户某时间段内有效”的租赁授权。注意客户端时间可被用户改,严肃场景应改为向服务器取当前时间。

五、远程许可证:XML-RPC 许可服务器

最强方案是把“是否合法”的判断放到你控制的服务器。EA 用前文 MQL5-RPC 框架向远程 XML-RPC 服务器发请求(如 isValid(ea_name, broker, account)),服务器查 licenses 字典决定是否放行。Python 端用 SimpleXMLRPCServer 几行就能起一个许可服务。好处是密钥可随时吊销、可统计活跃授权,且核心逻辑不在客户端。

# 远程许可服务器(Python 侧,节选)
from SimpleXMLRPCServer import SimpleXMLRPCServer
class RemoteLicenseExample(SimpleXMLRPCServer):
    def __init__(self):
        SimpleXMLRPCServer.__init__(self, ("192.168.2.103", 9099))
        self.register_function(self.xmlrpc_isValid, "isValid")
        self.licenses = {}
    def addLicense(self, ea_name, broker_name, account_number):
        ...  # 把授权写入 self.licenses

六、再加一层:base64 与 PGP 加固

文章还演示用 base64 对敏感字符串编码(Base64.mqh),以及建议引入 PGP 做非对称加密签名,让 EA 与指标获得“超安全”保护。base64 只是编码不是加密,适合隐藏明文;PGP 才是真加密,配合远程许可能抵御大部分破解。作者也提醒:MQL5.com 市场自带官方授权机制,和本文思路不冲突,两者结合防护更牢。

落地顺序建议:个人/内部用 → 密码或账户绑定足够;对外销售 → 账户绑定 + 时间限制 + 远程许可;高价值策略 → 远程许可 + PGP 验签。记住任何纯客户端校验都能被逆向,真正的保险箱在服务器端。

七、小结

MQL5 代码保护是一条强度递增的光谱:密码框挡小白、密钥生成器批量发码、账户绑定锁环境、时间限制控租期、远程许可把裁决权收回服务器,再用 base64/PGP 加固传输与签名。选哪层取决于你分发的风险等级——但永远记住:客户端能跑的代码就能被看,重要的授权判断尽量放在你控制的服务器端。把它当 EA 商品化的安全清单。

常见问题

最朴素是密码/序列号保护:首次运行弹 CChartObjectEdit 输入框,用户输入与内置 allowed_passwords 数组匹配的代码才放行,在 OnChartEvent 收到 CHARTEVENT_OBJECT_ENDEDIT 时校验。只能挡普通用户,密码写死在代码里易被逆向提取。
密钥生成器按规则造合法码(如 XXXXX-XXXXX-XXXXX,三组分别被 3/4/5 整除),校验时按规则判断,比维护一长串密码优雅、可批量发码。但纯前端规则仍可被逆向还原,属教学级方案。
用 AccountInfoString/AccountInfoInteger 读取经纪商名和账户号,只有匹配预设的 allowed_broker / 允许账号才运行。即使密钥泄露,换账户也跑不起来,适合“按账户授权”的商业分发。
EA 启动时通过 MQL5-RPC 框架向你的 XML-RPC 许可服务器发请求(如 isValid(ea_name, broker, account)),服务器查授权字典决定放行与否。Python 用 SimpleXMLRPCServer 几行即可起服务,密钥可随时吊销、可统计活跃授权。
base64 只是编码(非加密),用来隐藏明文敏感串;PGP 是非对称加密签名,能让 EA/指标获得真正的“超安全”保护。文章建议两者结合远程许可使用。但任何纯客户端校验都能被逆向,关键授权判断应放在服务器端。