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

时间:2014-07-22 18:59:48

标签: c++ date visual-c++ software-design license-key

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

那么让我来讨论一下我到目前为止做了些什么:(如果你想要我粘贴它们,请不要包含代码告诉我)

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

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

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

  1. 验证序列号
  2. 计算唯一的机器ID - 获取BIOS_SL,MB_SL,HDD_SL,将它们添加到一个字符串中并将其添加到MD5中。
  3. 计算许可有效期 - 获取互联网当前时间,使用计划持续时间增加年份
  4. 将以下信息存储在注册表中(多个位置) - license_id,machine_id,valid_till,activation_date,last_updated& license_status
  5. 此处跳过一些逻辑步骤,就像许可证已激活一样,检查并匹配已注册的machine_id

    因此该软件已注册。现在,我每次软件启动时都会再次在注册表中查找这些值并根据它做出决定,这里是我被困住的地方,需要你的专家建议。

    1. 软件启动
    2. 检查注册表值
    3. 生成machine_id并将其与存储的
    4. 相匹配
    5. 读取valid_till值(到期日期)并将其与当前时间匹配。
    6. 考虑到用户没有互联网并使用它一次激活或他的互联网计划已过期,我该如何对该日期进行合理检查?无法使用系统时间他们非常容易受到攻击。

      此时我想到创建一个服务,当用户尝试更改系统日期时,该服务将具有回调功能。但这很乏味,我认为不是最佳解决方案。

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

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

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

3 个答案:

答案 0 :(得分:2)

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

最简单的可能只需要一个互联网连接。但我们已经看到了XBox和其他游戏公司的收视情况。

如果您无法依靠互联网连接来执行支票,那么您可能会注意到"可疑"活动。例如,记录应用程序的上次运行时间。如果由于某种原因,系统时钟报告最后一次记录的运行时间之前的时间,则提示用户建立互联网连接并进行验证。

请记住,用户可能有合理的理由设置时钟。夏令时是一个。也许使用一个阈值,比如忽略一小时或一天或其他什么时候设置的时钟。

答案 1 :(得分:2)

您可以执行以下步骤:

  1. 当程序启动时,您必须存储当前时间并将其保存在 加密文件。在第一次t0(第一次sw执行)这个文件 必须包含空时间值。请注意,此文件必须是必填项。如果 当前时间是最后存储时间的一小部分(异常 情况)增加你的经过时间如下:last_time + = last_time - CURRENT_TIME;
  2. 在程序执行期间,跟踪添加时间所经过的时间 存储在加密文件中(您可以使用" time()"功能)。做 程序执行期间的一些检查:必须经过的时间 许可时间的一小部分。如果程序始终如此,这将非常有用 在运行一段时间超过许可证时间
  3. 在关闭程序之前,您必须更新加密文件(1)
  4. 中的时间信息

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

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

    抱歉我的英文!

答案 2 :(得分:1)

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

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