.NET中的LicenseProvider使用RSA加密来保护产品许可证

时间:2009-12-14 11:49:53

标签: .net rsa copy-protection

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

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

(BTW计算机ID是以下各项的组合:MAC地址+ CPU串行+硬盘驱动器串行。因此,如果其中一项更改,则需要续订许可证)

就这么简单?正如我所看到的,即使您可以解密.lic文件,也无法再次对其进行加密,因为您没有所需的私钥。

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

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

感谢您的反馈!

3 个答案:

答案 0 :(得分:3)

无论你是否对代码进行模糊处理,关键是你的技术不安全而且可能被打败。您的产品许可方案只会与您的混淆一样安全。

不要使用RSA加密唯一ID或许可证文件,而应考虑使用RSA加密模块,程序集或类库,其中包含您在购买的完整版本中只需要的基本核心组件或某些关键功能。这样,没有适当的许可证,完整版本的功能或应用程序的核心逻辑根本就不存在,而不是所有的辛苦工作都被JMP指令窃取到完整版本的入口点,即“许可”软件。 / p>

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

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

理想情况下,您可以将模块解密为受保护的内存空间,而这些内存空间无法被其他应用程序读取,也不会被分页到磁盘,然后从内存中运行并在完成后立即被覆盖。当然,这种技术并非绝对可靠,而且一位坚定的逆向工程师可能会获得一个解密模块进行再分配,但即便如此,有人也不得不从你那里的某个地方购买合法许可证。

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

我希望我给你一些值得思考的东西。请记住,如果整个内容被解密并且可供用户复制,则无法控制用户所创建的副本数量,因此我建议在应用程序未执行时保持一些组件加密。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

只是为了澄清(您可能指的是),您应该使用[provider] .SignData([params])签署数据并验证许可证使用[provider] .VerifyData([params])。另外,请不要忘记从您创建的密钥对中删除私钥。