【发布时间】:2014-09-13 18:10:10
【问题描述】:
我正在尝试创建一个基于订阅的许可系统,如果您为 1 年 1 用户购买软件,您只能在用于激活软件的机器上使用一年,之后您必须更新您的许可证密钥。这是非常基本的,但实现你自己的相同是完全不同的场景。
所以让我讨论一下我到目前为止所做的事情:(如果您希望我粘贴它们,请告诉我未包含的代码)
首先我有一个托管的 MySQL 数据库,其中有一个存储所有许可证相关信息(产品、序列号、计划等)的数据库
因此,当您第一次启动该软件时,它会检查注册表中的一些值(多个位置),如果未找到,它会要求您提供序列号。
输入序列号后,软件将连接到数据库并验证您的密钥并计算以下内容
- 验证序列号
- 计算唯一的机器 ID - 获取 BIOS_SL 、 MB_SL 、 HDD_SL ,将它们添加到一个字符串中并对其进行 MD5 处理。
- Compute License Validity - 获取 Internet 当前时间,以计划持续时间递增年份
- 将以下信息存储在注册表中(多个位置) - license_id 、 machine_id、valid_till、activation_date、last_updated 和 license_status
这里跳过了一些逻辑步骤,比如如果许可证已经激活,检查并匹配注册的 machine_id
所以该软件已注册。现在,我每次启动软件时都会再次在注册表中查找这些值并根据它做出决定,这就是我卡住的地方,需要您的专家建议。
- 软件启动
- 检查注册表值
- 生成 machine_id 并将其与存储的匹配
- 读取 valid_till 值(到期日期)并将其与当前时间匹配。
考虑到用户没有互联网并且使用过一次激活或他的互联网计划已过期,我如何才能对日期进行合法检查?无法使用系统时间,它们非常脆弱。
此时我想创建一个服务,当用户尝试更改系统日期时,该服务将具有回调功能。但这很乏味,我想这不是最好的解决方案。
或者在启动时记录系统时间并依赖它,但是用户甚至可以在系统启动之前通过 BIOS 更改它。
抱歉问了这么长的问题,但不得不解释整个场景。
简而言之,用户没有互联网连接如何维护或获取日期/时间调用的合法来源?
【问题讨论】:
-
您还没有接受任何答案。我想知道你的发现。您在软件中实现了什么?
标签: c++ date visual-c++ software-design license-key