【问题标题】:LicenseProvider in .NET using RSA encryption to protect product license.NET 中的 LicenseProvider 使用 RSA 加密来保护产品许可证
【发布时间】:2010-12-26 09:46:04
【问题描述】:

我正在尝试使用 Microsoft 的 LicenseProvider 找到可靠的许可方案。我的想法是通过 RSA(具有 2048 位密钥的 RSACryptoServiceProvider)的方式使用异步加密。 我发现这很容易,但我不确定这个机制到底有多安全。这不是为了好玩,需要对美国的许多产品(我们说的是大约 100 次安装)进行复制保护。不需要过期日期。

现在,我使用私钥加密许可证文件 (.lic)。在客户的计算机上,许可证管理器将在运行时将计算机的唯一 ID 与 .lic 文件中存储的唯一 ID 进行核对。 由于产品将具有相应的公钥,因此可以解密文件。 如果 ID 匹配,则许可证有效并且程序启动。

(顺便说一句,计算机 ID 是 MAC 地址 + CPU 序列号 + 硬盘驱动器序列号的组合。因此,如果其中一项发生更改,则需要更新许可证)

就这么简单?在我看来,即使您可以解密 .lic 文件,也永远无法再次加密它,因为您没有所需的私钥。

现在,除了购买昂贵的第 3 方解决方案、破解和规避许可 DLL 之外,您认为使用 RSA+computerID 的想法有多安全?

(是的,我们正在研究混淆代码以使其更好)

感谢您的反馈!

【问题讨论】:

  • 我可能在这里错了。您提到您使用私钥进行加密。我认为您使用可以与用户共享的公钥加密数据。您使用只有您知道的私钥解密数据。拥有公钥的人无法解密数据。我认为您可以使用私钥签名,然后检查其他人是否可以仅使用公钥验证它是否来自您。

标签: .net rsa copy-protection


【解决方案1】:

我有相同类型的解决方案。 但是,我只是想指出,混淆代码并不能阻止逆向工程和黑客攻击,它只会使理解逆向工程代码的工作变得更加困难。 混淆是这​​个过程中的一个重要步骤,因为没有它,对代码进行逆向工程,定位安全方法,并使其返回成功结果(即无需花费数月时间试图破解加密密钥,黑客会绕过它)。

【讨论】:

    【解决方案2】:

    为了澄清起见,(您可能已经提到过)您应该使用 [provider].SignData([params]) 对数据进行签名,并使用 [provider].VerifyData([params]) 来验证许可证。也不要忘记从您创建的密钥对中删除私钥。

    【讨论】:

      【解决方案3】:

      不管你是否混淆了代码,关键是你的技术不安全,可能会被打败。您的产品的许可方案只会与您的混淆一样安全。

      与其使用 RSA 来加密唯一 ID 或许可证文件,不如考虑使用 RSA 来加密具有基本核心组件或某些关键功能的模块、程序集或类库,而您只希望在购买的完整版本中提供这些功能。这样,如果没有适当的许可,完整版本的功能或应用程序的核心逻辑根本不存在,而不是您的所有辛勤工作都被 JMP 指令窃取到完整版本“许可”软件的入口点。

      从根本上说,这个概念的最基本实现是制作您在购买后收到的“许可证”,并且必须将公钥粘贴到程序中以解密加密的模块/组件。但是,您不希望这样做,因为一个人可以购买“许可证”,然后将其赠送给他的所有人或将其发布在他的博客上。至少,解密完整版功能的密钥应该使用另一个密钥加密,并包含在软件的每个副本中。然后,“许可证”将是解密受保护软件解密的真实密钥的公钥。这样,您可以拥有多个版本的许可证,或者如果一个版本发布在所有流行的连续剧网站上,则可以对其进行更改。

      更进一步,加密许可证的“许可证”将简单地使用计算机“唯一 ID”进行散列或对称加密,该 ID 在支付处理期间的某个时间提供给服务器。这样,只有那台计算机可以生成正确的“密码短语”,如果你愿意的话,它可以恢复密钥以解密密钥以解密程序/dll/whathaveyou。

      理想情况下,您会将模块解密到其他应用程序无法读取且不会分页到磁盘的受保护内存空间中,然后从内存中运行并在完成后立即被覆盖。当然,这种技术不是万无一失的,一个坚定的逆向工程师可能会获得一个解密的模块以进行重新分发,但即使发生这种情况,也必须有人从你那里购买合法的许可证。

      其他想法包括将核心功能或关键数据结构存储为已编译的机器语言或中间语言,加密并在服务器上某处,必须通过验证才能在每次需要执行该功能时从服务器检索该信息,并被直接解密到受保护的内存中,然后从中执行,但这种复杂程度几乎没有必要,并且对于所涉及的复杂程度并没有提供很多额外的安全性。

      我希望我给了你一些思考。请记住,如果整个内容已解密并且可供用户复制,则无法控制用户复制的数量,因此我建议在应用程序未执行时对某些组件进行加密。

      【讨论】:

      • 这听起来很有趣。您能否发布一些示例代码,说明如何加密部分代码然后在运行时解密?
      猜你喜欢
      • 2011-02-02
      • 2012-07-09
      • 2010-09-20
      • 2014-07-09
      • 2011-09-30
      • 2017-05-16
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多