我是Cryptolens软件许可平台背后的开发人员之一,自 14 岁以来一直致力于许可系统。在这个答案中,我根据多年来获得的经验提供了一些技巧。
解决此问题的最佳方法是设置一个许可证密钥服务器,应用程序的每个实例都将调用该服务器以验证许可证密钥。
许可证密钥服务器的好处
许可证密钥服务器的优点是:
- 您始终可以立即更新或阻止许可证密钥。
- 每个许可证密钥都可以锁定到一定数量的机器上(这有助于防止用户在线发布许可证密钥供其他人使用)。
注意事项
虽然在线验证许可证可以让您更好地控制应用程序的每个实例,但互联网连接并不总是存在(尤其是如果您针对大型企业),因此我们需要另一种执行许可证密钥验证的方法。
解决方案是始终使用 RSA 或 ECC 等公钥密码系统对来自服务器的许可证密钥响应进行签名(如果您计划在嵌入式系统上运行,可能会更好)。您的应用程序应该只有公钥来验证许可证密钥响应。
因此,如果没有 Internet 连接,您可以改用之前的许可证密钥响应。确保在响应中存储日期和机器标识符,并检查它不是太旧(例如,您允许用户最多离线 30 天等)并且许可证密钥响应属于正确的设备。
请注意,您应该始终检查许可证密钥响应的证书,即使您已连接到 Internet),以确保它在离开服务器后没有被更改(即使您的 API 到许可证密钥服务器使用 https)
保护秘密算法
大多数 .NET 应用程序都可以很容易地进行逆向工程(微软提供了一个反汇编程序来获取 IL 代码,一些商业产品甚至可以检索源代码,例如 C#)。当然,你总是可以混淆代码,但它永远不是 100% 安全的。
在大多数情况下,任何软件许可解决方案的目的都是帮助诚实的人诚实(即愿意付费的诚实用户不要忘记在试用期结束后付费等)。
但是,您可能仍然有一些您绝对不想泄露给公众的代码(例如,预测股票价格的算法等)。在这种情况下,唯一的方法是创建一个API 端点,您的应用程序将在每次执行该方法时调用该端点。它需要互联网连接,但它确保您的密码永远不会被客户端计算机执行。
执行
如果您不想自己实现所有内容,我建议您查看本教程(Cryptolens的一部分)