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

Gen*_*oax 5 c++ date software-design license-key visual-c++

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

所以让我讨论我到目前为止所做的:(不包括代码,如果你想让我粘贴它们,请告诉我)

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

因此,当您第一次启动该软件时,它会检查注册表中的几个值(多个位置),如果没有找到,它将要求您提供序列号。

输入序列号后,软件将连接到数据库并验证您的密钥并计算以下内容

  1. 验证序列号
  2. 计算唯一的机器 ID - 获取 BIOS_SL 、 MB_SL 、 HDD_SL ,将它们添加到一个字符串中并对其进行 MD5。
  3. 计算许可证有效性 - 获取 Internet 当前时间,使用计划持续时间增加年份
  4. 将以下信息存储在注册表中(多个位置)- license_id 、 machine_id、valid_till、activation_date、last_updated 和 license_status

此处略过一些逻辑步骤,例如如果许可证已经激活,请检查并匹配注册的 machine_id

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

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

考虑到用户没有上网,只用了一次激活或上网套餐过期,如何进行合法的日期查询?不能使用系统时间,他们非常脆弱。

此时我想创建一个服务,该服务将具有回调函数,以便在用户尝试更改系统日期时采取行动。但这很乏味,我认为这不是最好的解决方案。

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

抱歉问了这么长的问题,但必须解释整个场景。

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

Dav*_*ger 2

你可以做一些事情,但你永远不会得到 100% 万无一失的东西。

最简单的可能只需要互联网连接。但我们已经看到 Xb​​ox 和其他游戏公司对此的反应有多好。

如果您无法依靠互联网连接来执行检查,您可以监视“可疑”活动。例如,记录应用程序的上次运行时间。如果由于某种原因系统时钟报告的时间早于上次记录的运行时间,则提示用户建立互联网连接并进行验证。

请记住,用户调回时钟可能有正当理由。夏令时就是其中之一。也许可以使用一个阈值,例如忽略时钟被调慢一小时或一天或其他什么。