基于订阅的软件许可-离线验证

Subscription based licensing your software - Offline validation

本文关键字:离线 验证 许可 软件 于订阅      更新时间:2023-10-16

我正在尝试创建一个基于订阅的许可系统,如果您购买1年1用户的软件,您只能在用于激活软件的机器上使用它一年,之后您将不得不更新您的许可密钥。这是非常基本的,但实现您自己的相同是完全不同的场景。

那么让我来讨论一下我到目前为止所做的:(代码不包括,如果你想让我粘贴,请告诉我)

首先,我有一个托管MySQL数据库,其中我有一个数据库,存储所有许可证相关信息(产品,serial_keys,计划等)

所以,当你第一次启动软件时,它会在注册表(多个位置)中检查一些值,如果没有找到,它会要求你输入一个串行密钥。

一旦您输入了串行密钥,软件将连接到DB并验证您的密钥并计算以下

  1. 验证串行密钥
  2. 计算唯一的机器ID -获取BIOS_SL, MB_SL, HDD_SL,将它们添加到一个字符串中并进行MD5验证。
  3. 计算许可证有效期-获取互联网当前时间,以计划持续时间增加年份
  4. 在注册表(多个位置)中存储以下信息- license_id, machine_id, valid_till, activation_date, last_updated &;license_status

这里跳过了几个逻辑步骤,比如如果许可证已经激活,检查并匹配注册的machine_id

所以软件是注册的。现在,我每次软件启动时,它会再次在注册表中查找这些值,并根据它做出决定,这就是我卡住的地方,需要您的专家建议。

  1. 软件开始
  2. 检查注册表值
  3. 生成machine_id并与存储的machine_id匹配
  4. 读取valid_till值(过期日期)并将其与当前时间匹配。

考虑到用户没有互联网并且使用它是一次性激活或他的互联网计划过期,我如何合法地检查日期?不能使用系统时间,他们是非常脆弱的。

在这个时刻,我想创建一个服务,它将有一个回调函数,每当用户试图改变系统日期时,它就会起作用。但这是乏味的,我认为不是最好的解决方案。

或者在引导时记录系统时间并依赖于此,但是用户可以在系统启动之前通过BIOS更改它。

很抱歉问这么长的问题,但必须解释整个情况。

简而言之,用户没有互联网连接,如何维护或获取日期/时间调用的合法源?

您可以执行以下程序:

  1. 当程序启动时,您必须存储当前时间并将其保存在加密的文件。在第一次执行t0(第一次软件执行)这个文件必须包含空时间值。注意这个文件必须是强制性的。如果当前时间小于上次存储的时间(异常)情况)按如下方式增加运行时间:last_time += last_time -当前时间;
  2. 在程序执行期间,跟踪经过的时间加上时间存储在加密文件中(您可以使用"time()"函数)。做程序执行期间的一些检查:运行时间必须为未成年人的许可证时间。如果程序总是
  3. 在关闭程序之前,您必须更新加密文件中的时间信息(1)

虽然这个方法不准确,但它可以保护您避免不当使用您的程序。

注意:如果程序将连接到互联网,您可以在加密文件中恢复有关正确经过时间的所有信息。

对不起我的英语!

你可以做一些事情,但你永远不会得到100%的傻瓜。

最简单的可能是只需要一个互联网连接。但我们已经看到XBox和其他游戏公司对它的反应有多好。

如果你不能指望互联网连接来执行检查,你可以观察"可疑"活动。例如,保存应用程序最后一次运行时的记录。如果由于某种原因,系统时钟报告的时间比上次记录的运行时间早,则提示用户建立internet连接并进行验证。

请记住,用户设置时钟可能有合理的原因。日光节约时间就是其中之一。也许可以设置一个阈值,比如忽略时钟被拨回一个小时或一天或其他。

我们已经列出了算法,我不会重复,它确实解决了问题,现在BIOS检查,我们只需要确保它不会回去。每次程序启动时,我们记录当前时间,如果用户有双向许可证,他需要设置他的,如果他安装后程序可以检测到

现在如果用户在安装之前更改了bios时间,我们仍然可以,因为程序会将其视为正确的时间,并从该时间计算年份。