文章 "保证 MQL5 代码的安全:密码保护、钥匙生成器、时间限制、远程许可证及先进的 EA 许可证密钥加密技术" - 页 3 123456 新评论 Joshua Graham 2012.10.06 09:09 #21 allicient:你也可以把前门换成加固钢板,但如果你把钥匙放在门垫上,也无法阻止别人进入。 你所描述的保护措施可以阻止随便的编码者,但肯定无法阻止有动机的攻击者。问题不在于加密--那是最简单的部分--而在于如何处理密钥和解密过程。在这种情况下,攻击者--按照经典的说法,我们称她为 Mallory--希望复制并分发她拥有密钥的 EX5,那么她当然可以通过以下方式做到:i. 使用密钥运行 EX5;在运行过程中监控进程,例如在进程中附加一个 DLL,并在解密后立即转储 EX5 的内容;iii. 重新组装现在的明文 EX5(如果费心的话,还可能反汇编成源代码)。如果您的第一点保护涉及签名验证,那么攻击者要分发文件,只需分发一个替换了相关公钥的不同 MQL 可执行文件即可。 如果 MQL5 使用加密 API 来验证证书,那么就可以从二进制文件中剥离出来。这种情况会一直 持续下去。这些都是在开始考虑密钥管理这个噩梦之前的事情。虽然这种二进制分析超出了我现在的能力范围,但我知道有几个人可以毫不费力地完成。 因此,您应该担心的不是加密的强度,而是您有一个无效的安全模型。 这本身 并不是一个特殊的问题,因为没有人期望 MetaTrader 能解决这个问题 - 这个问题还有其他非常有用的解决方案,特别是让 MQL5/EX5 代码的所有者在他们控制的独立服务器上运行,并授权买家访问/信号。因此,我不明白为什么人们需要这种设施,而它却很难正确实现,至少在没有防篡改硬件的情况下。allicient 提出了很多有道理的观点。 对于任何真正的保护,我建议如下:对于源代码的基本保护,在 dll 中塞入尽可能多的功能就可以了。 MT5 和编程之间的最低限度的接口代码也可以。 我不相信 ex4/ex5 中的完整源代码,除非您将软件赠送出去。 但这篇文章是关于保护付费/商业产品或不提供源代码的免费产品的知识产权。对于许可而言,最好的保护措施是拥有 ex4/dll 组合的独立演示版和正式版。这样做的好处是,开发者和客户都会比较麻烦,因为开发者必须维护/编译自己的软件的两个版本。 但是,这样可以减少有人通过黑客获取完整版软件的机会;因为他们只能使用演示版。这在很大程度上取决于演示的目的。 如果你想为客户提供完整的功能,那么此外,实施许可可能会要求在本地软件运行之前远程运行一小部分必要代码。 CNS SaaS(软件即服务)实际上已经做到了这一点,它被称为 CCoHS(在托管服务器 上调用代码)功能。 您可以将 EA 正常运行所需的有限部分代码托管。这样,即使有人盗用 EA 或破解了许可 dll,也会导致 dll 失效。 托管代码服务器与 EA 和/或许可服务器之间会有延迟,但您可以绕过这个问题。 实现起来并不难,但用户必须想办法在自己的服务器上实现 CCoHS。规模较小时,可以在预算有限的服务器或其他地方实施,当用户数量增加时再扩大规模。托管功能虽然是所有选项中最昂贵的,但它能在有人反编译您的 dll 的情况下提供真正的保护,而这是不太可能的。 他们很可能会 "破解 "您的 dll,使您的软件正常工作。 但如果没有所需的托管功能,它仍然是无用的。 除非我在这里漏掉了什么。 Anton Kombarov 2013.01.29 16:47 #22 MetaQuotes:已发布文章保护 MQL5 程序:密码、密钥、时间限制、远程许可证检查:作者:investeo3.绑定到帐户 - 我尝试将 Expert Advisor 的工作绑定到帐户。保护不起作用,它给出的信息是/the work of the Expert Advisor on this account is not allowed/,但 EA 仍在交易。编译时没有出错。我不知道出了什么问题。 Kourosh Hossein Davallou 2013.06.29 17:36 #23 感谢文章 TARCISIO LEMOS SILVA 2015.08.19 20:03 #24 我如何将这些命令行添加到为 metatrader 4 开发的 ea 中? 这行代码应放在 哪里??? Liubomir Gaidarji 2016.11.16 13:05 #25 您好,我有一个问题,我想在我的网站上出售顾问,但我不知道如何操作,有没有人可以帮助我?在此先表示感谢! macling66 2018.09.01 16:32 #26 你好、 感谢您的文章。请教我在密码保护 方面,如何使输入密码时显示星号("*")或点 号("-")。 我不擅长编程。 谢谢 Konstantin Vinokurov 2018.09.01 18:10 #27 Peter Maxwell:很抱歉,我说得很刻薄,但这篇文章所介绍的不是安全性,而是模糊性。 拷贝保护是一个极其 困难的问题,因此音乐/电影行业在 DRM 方面做了很多努力,但却屡屡失败。充其量,这里的信息会浪费一些人的时间;最糟糕的情况是,你可能会给读者带来虚假的安全感。 如果他们决定使用你的建议来 "保护 "产品,当他们的消费者在几个小时内取消保护并以极低的价格转售产品时,他们可能会有些惊讶。严重的是,base64 编码与加密无关。 Base64 编码的设计目的是让 8 位数据可以安全地通过认为数据编码为 7 位的协议进行传输。 你可以轻易地逆转 base64 编码,它就是为此目的而设计的!在我看来,安全分发 MQL5 软件的唯一解决方案是通过经纪人的有限授权条款,或者在某个服务器上安装带有 .ex5 文件的 MQL5 实例,并允许客户 使用瘦客户端访问(这样他们就无法下载 .ex5)。 是的,我在信息安全领域工作了 15 年以上,所以对我所说的有相当的了解。老实说,我对 Metaquotes 发表这篇文章感到非常惊讶。 没错。正是如此。 Adolfo Daniel Aguirre 2019.03.15 18:46 #28 您好,下午好,我需要帮助,以便能够实现在 mt4 中按帐号 使用 EA,并允许我修改,而且只能在许可证范围内的帐户中使用,并且可以远程启用和禁用它,因为它使用了两个 mt4 一个主帐户和一个从帐户。我附上代码的说明,以及我如何才能更好地让它很好地工作,因为如果我输入许可证之外的另一个帐户,它的工作原理是一样的。 <?xml version="1.0" encoding="UTF-8"? <许可证 <程序版本 </programVersion> <licenseType>F <licenseType>Full</licenseType> <validityPeriod> </validityPeriod> 有效期 <validityPeriod> 有效期 <结束日期>1/18/2080</结束日期 </validityPeriod <所有者 <所有者名称 <账户>6789</账户 <账户>7994</账户 <账户>22302</账户 </ 所有者名称 </所有者> < 签名 <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <签名信息 <CanonicalizationMethod 算法="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /> <SignatureMethod 算法="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> <Reference URI=""> <Transforms> 转换 <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> </Transforms> <DigestMethod Algorithm= "" /> <DigestMethod 算法="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>Cl8vF8+Uyyms3pEodjip5ol5J4s=</DigestValue </参考 </SignedInfo> <签名值 p/NlTyHeUy5CVC01H/2WmvTcN8TqJhrInkhqtyzR6vqn/koJHqm6fiD6mepklpn4fud0em7vqOiyWcQ9KQ8jqoyoN9ExkJUEvepWBQT2HHcaoW2kpV17ch+CZvtFX74cHE23WrOi9/p3RoK/4G0rsgvdjvefdZRQRsM5k=</SignatureValue></SignatureValue </签名 </license> Xiaowei Yan 2019.05.15 11:43 #29 我有一个想法。假设有一个网络监控器,它一直在查看网络流。 1.EA 客户端调用网络服务器的 sha.pub 密钥,该密钥由服务器随机生成。 2.2. EA 发送一些请求授权的数据给服务器,并附上 pub 密钥,这样监视器就无法知道这些数据是什么。数据中可能包含客户端生成的一些随机密钥。由于存在 sha 密钥,监控程序无法解密数据。 3.3. 服务器收到数据后,会发送由客户端发送的密钥加密的授权许可信息。监视器可能会解密这些信息,因为它可能知道发布者的 sha 密钥,但它不知道客户端的密钥,所以这些信息仍然是无用的。 这样,服务器就可以控制 EA 客户端的行为。 Daniel Weckhuyzen 2019.11.16 18:02 #30 你好,是否可以根据 Python 的新版本更新这篇文章? 我做不到。PS: Python 对我来说还是个新东西。 谢谢、 丹尼 123456 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
你也可以把前门换成加固钢板,但如果你把钥匙放在门垫上,也无法阻止别人进入。 你所描述的保护措施可以阻止随便的编码者,但肯定无法阻止有动机的攻击者。
问题不在于加密--那是最简单的部分--而在于如何处理密钥和解密过程。
在这种情况下,攻击者--按照经典的说法,我们称她为 Mallory--希望复制并分发她拥有密钥的 EX5,那么她当然可以通过以下方式做到:
i. 使用密钥运行 EX5;
在运行过程中监控进程,例如在进程中附加一个 DLL,并在解密后立即转储 EX5 的内容;
iii. 重新组装现在的明文 EX5(如果费心的话,还可能反汇编成源代码)。
如果您的第一点保护涉及签名验证,那么攻击者要分发文件,只需分发一个替换了相关公钥的不同 MQL 可执行文件即可。 如果 MQL5 使用加密 API 来验证证书,那么就可以从二进制文件中剥离出来。这种情况会一直 持续下去。
这些都是在开始考虑密钥管理这个噩梦之前的事情。
虽然这种二进制分析超出了我现在的能力范围,但我知道有几个人可以毫不费力地完成。 因此,您应该担心的不是加密的强度,而是您有一个无效的安全模型。 这本身 并不是一个特殊的问题,因为没有人期望 MetaTrader 能解决这个问题 - 这个问题还有其他非常有用的解决方案,特别是让 MQL5/EX5 代码的所有者在他们控制的独立服务器上运行,并授权买家访问/信号。
因此,我不明白为什么人们需要这种设施,而它却很难正确实现,至少在没有防篡改硬件的情况下。
allicient 提出了很多有道理的观点。 对于任何真正的保护,我建议如下:
对于源代码的基本保护,在 dll 中塞入尽可能多的功能就可以了。 MT5 和编程之间的最低限度的接口代码也可以。 我不相信 ex4/ex5 中的完整源代码,除非您将软件赠送出去。 但这篇文章是关于保护付费/商业产品或不提供源代码的免费产品的知识产权。
对于许可而言,最好的保护措施是拥有 ex4/dll 组合的独立演示版和正式版。这样做的好处是,开发者和客户都会比较麻烦,因为开发者必须维护/编译自己的软件的两个版本。 但是,这样可以减少有人通过黑客获取完整版软件的机会;因为他们只能使用演示版。这在很大程度上取决于演示的目的。 如果你想为客户提供完整的功能,那么
此外,实施许可可能会要求在本地软件运行之前远程运行一小部分必要代码。 CNS SaaS(软件即服务)实际上已经做到了这一点,它被称为 CCoHS(在托管服务器 上调用代码)功能。 您可以将 EA 正常运行所需的有限部分代码托管。这样,即使有人盗用 EA 或破解了许可 dll,也会导致 dll 失效。 托管代码服务器与 EA 和/或许可服务器之间会有延迟,但您可以绕过这个问题。 实现起来并不难,但用户必须想办法在自己的服务器上实现 CCoHS。规模较小时,可以在预算有限的服务器或其他地方实施,当用户数量增加时再扩大规模。
托管功能虽然是所有选项中最昂贵的,但它能在有人反编译您的 dll 的情况下提供真正的保护,而这是不太可能的。 他们很可能会 "破解 "您的 dll,使您的软件正常工作。 但如果没有所需的托管功能,它仍然是无用的。 除非我在这里漏掉了什么。
已发布文章保护 MQL5 程序:密码、密钥、时间限制、远程许可证检查:
作者:investeo
3.绑定到帐户 - 我尝试将 Expert Advisor 的工作绑定到帐户。保护不起作用,它给出的信息是/the work of the Expert Advisor on this account is not allowed/,但 EA 仍在交易。编译时没有出错。我不知道出了什么问题。
这行代码应放在 哪里???
您好,我有一个问题,我想在我的网站上出售顾问,但我不知道如何操作,有没有人可以帮助我?
在此先表示感谢!
你好、
感谢您的文章。请教我在密码保护 方面,如何使输入密码时显示星号("*")或点 号("-")。
我不擅长编程。
谢谢
很抱歉,我说得很刻薄,但这篇文章所介绍的不是安全性,而是模糊性。 拷贝保护是一个极其 困难的问题,因此音乐/电影行业在 DRM 方面做了很多努力,但却屡屡失败。
充其量,这里的信息会浪费一些人的时间;最糟糕的情况是,你可能会给读者带来虚假的安全感。 如果他们决定使用你的建议来 "保护 "产品,当他们的消费者在几个小时内取消保护并以极低的价格转售产品时,他们可能会有些惊讶。
严重的是,base64 编码与加密无关。 Base64 编码的设计目的是让 8 位数据可以安全地通过认为数据编码为 7 位的协议进行传输。 你可以轻易地逆转 base64 编码,它就是为此目的而设计的!
在我看来,安全分发 MQL5 软件的唯一解决方案是通过经纪人的有限授权条款,或者在某个服务器上安装带有 .ex5 文件的 MQL5 实例,并允许客户 使用瘦客户端访问(这样他们就无法下载 .ex5)。 是的,我在信息安全领域工作了 15 年以上,所以对我所说的有相当的了解。
老实说,我对 Metaquotes 发表这篇文章感到非常惊讶。
您好,下午好,我需要帮助,以便能够实现在 mt4 中按帐号 使用 EA,并允许我修改,而且只能在许可证范围内的帐户中使用,并且可以远程启用和禁用它,因为它使用了两个 mt4 一个主帐户和一个从帐户。我附上代码的说明,以及我如何才能更好地让它很好地工作,因为如果我输入许可证之外的另一个帐户,它的工作原理是一样的。
<?xml version="1.0" encoding="UTF-8"?
<许可证
<程序版本
</programVersion> <licenseType>F
<licenseType>Full</licenseType> <validityPeriod> </validityPeriod> 有效期
<validityPeriod> 有效期
<结束日期>1/18/2080</结束日期
</validityPeriod
<所有者
<所有者名称
<账户>6789</账户
<账户>7994</账户
<账户>22302</账户
</ 所有者名称
</所有者> < 签名
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo> <签名信息
<CanonicalizationMethod 算法="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod 算法="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<Reference URI="">
<Transforms> 转换
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
</Transforms> <DigestMethod Algorithm= "" />
<DigestMethod 算法="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>Cl8vF8+Uyyms3pEodjip5ol5J4s=</DigestValue
</参考
</SignedInfo>
<签名值 p/NlTyHeUy5CVC01H/2WmvTcN8TqJhrInkhqtyzR6vqn/koJHqm6fiD6mepklpn4fud0em7vqOiyWcQ9KQ8jqoyoN9ExkJUEvepWBQT2HHcaoW2kpV17ch+CZvtFX74cHE23WrOi9/p3RoK/4G0rsgvdjvefdZRQRsM5k=</SignatureValue></SignatureValue
</签名
</license>
我有一个想法。假设有一个网络监控器,它一直在查看网络流。
1.EA 客户端调用网络服务器的 sha.pub 密钥,该密钥由服务器随机生成。
2.2. EA 发送一些请求授权的数据给服务器,并附上 pub 密钥,这样监视器就无法知道这些数据是什么。数据中可能包含客户端生成的一些随机密钥。由于存在 sha 密钥,监控程序无法解密数据。
3.3. 服务器收到数据后,会发送由客户端发送的密钥加密的授权许可信息。监视器可能会解密这些信息,因为它可能知道发布者的 sha 密钥,但它不知道客户端的密钥,所以这些信息仍然是无用的。
这样,服务器就可以控制 EA 客户端的行为。
你好,是否可以根据 Python 的新版本更新这篇文章?
我做不到。PS: Python 对我来说还是个新东西。
谢谢、
丹尼