gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:19:22 28 4
gpt4 key购买 nike

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

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

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

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

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

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

感谢您的反馈!

最佳答案

无论您是否混淆了代码,关键是您的技术并不安全并且可能会被击败。您产品的许可方案的安全程度取决于您的混淆程度。

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

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

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

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

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

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

关于.net - .NET 中的 LicenseProvider 使用 RSA 加密来保护产品许可证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1900462/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com