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

.NET中的LicenseProvider使用RSA加密保护产品许可证,.net,rsa,copy-protection,.net,Rsa,Copy Protection,我正试图利用微软的LicenseProvider找到一个可靠的授权方案。我的想法是通过RSA(具有2048bit密钥的RSACryptServiceProvider)使用异步加密。 我发现这很容易,但我不确定这个机制到底有多安全。这不是为了好玩,需要在美国复制保护许多产品(我们说的是大约100个安装)。不需要截止日期 现在,我使用私钥加密许可证文件(.lic)。在客户的计算机上,许可证管理器将在运行时根据存储在.lic文件中的唯一ID检查计算机的唯一ID。 由于产品将具有相应的公钥,因此它可以解

我正试图利用微软的LicenseProvider找到一个可靠的授权方案。我的想法是通过RSA(具有2048bit密钥的RSACryptServiceProvider)使用异步加密。 我发现这很容易,但我不确定这个机制到底有多安全。这不是为了好玩,需要在美国复制保护许多产品(我们说的是大约100个安装)。不需要截止日期

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

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

就这么简单?在我看来,即使你可以解密.lic文件,你也不能再加密它,因为你没有所需的私钥

现在,除了购买昂贵的第三方解决方案、破解和绕过授权DLL之外,您觉得使用RSA+computerID的想法有多安全

(是的,我们正在研究对代码进行模糊处理以使其更好)


谢谢你的反馈

我有相同类型的解决方案。 然而,我只想指出,混淆代码并不能阻止revese工程和黑客攻击,它只会使理解revese工程代码的工作更加困难。
在这个过程中,观察是一个重要的步骤,因为没有它,反向工程代码、定位安全方法并让它们返回成功结果(即不需要花费数月的时间试图破解encryptin密钥,黑客只需绕过它)相对容易。

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

无论您是否混淆了代码,关键是您的技术不安全,可能会失败。您产品的授权方案将只与混淆一样安全

<>而不是使用RSA加密一个唯一的ID或许可文件,考虑使用RSA来加密一个模块、程序集或类库,这些核心库或某些关键功能仅在购买的完整版本中可用。这样,没有适当的许可证,完整的版本功能或应用程序的核心日志。ic根本就不存在,而不是你所有的辛苦工作都被JMP指令窃取到你完整版本的“授权”软件的入口点

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

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

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

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


我希望我给了你一些思考的东西。请记住,如果整个内容都被解密并可供用户复制,那么控制用户复制的副本数量就变得不可能了,因此我建议在应用程序未执行时对某些组件进行加密。

我可能错了。你提到你使用pri加密vate密钥。我认为您使用可以与用户共享的公钥对数据进行加密。您使用仅为您所知的私钥对数据进行解密。使用公钥的人无法解密数据。我认为您可以使用私钥进行签名,然后检查其他人是否可以验证您是否仅使用公钥。这听起来非常有趣。能否请您发布一些示例代码,说明如何对部分代码进行加密,然后在运行时对其进行解密?