c – 基于订阅的软件许可 – 离线验证
我正在尝试创建基于订阅的许可系统,如果您购买1年1用户的软件,您只能在用于激活软件的计算机上使用它一年,之后您将需要续订许可证键.这是非常基本的,但实现相同的是一个完全不同的场景.
那么让我来讨论一下我到目前为止做了些什么:(如果你想要我粘贴它们,请不要包含代码让我知道)
首先我有一个托管的MySQL数据库,我有一个存储所有许可证相关信息的数据库(产品,serial_keys,Plans等)
因此,当您第一次启动软件时,它会检查注册表中的一些值(多个位置),如果没有找到,它将要求您输入序列密钥.
输入序列密钥后,软件应连接到DB并验证密钥并计算以下内容
>验证序列号>计算唯一的机器ID – 获取BIOS_SL,MB_SL,HDD_SL,将它们添加到一个字符串和MD5中.>计算许可证有效性 – 获取Internet当前时间,使用计划持续时间增加年份>将以下信息存储在注册表中(多个位置) – license_id,machine_id,valid_till,activation_date,last_updated& license_status
如果许可证已激活,此处跳过一些逻辑步骤,检查并匹配已注册的machine_id
所以该软件已注册.现在,我每次软件启动它都会再次在注册表中查找这些值并根据它做出决定,这里是我被困住的地方,需要你的专家建议.
>软件启动>检查注册表值>生成machine_id并将其与存储的匹配>读取valid_till值(到期日期)并将其与当前时间匹配.
考虑到用户没有互联网并使用它进行一次激活或他的互联网计划已过期,我该如何对该日期进行合理检查?无法使用系统时间他们非常容易受到攻击.
此时我想到创建一个服务,它将具有一个回调函数,以便在用户尝试更改系统日期时执行操作.但这很乏味,我认为不是最好的解决方案.
或者在启动时记录系统时间并依赖于此,但用户甚至可以在系统启动之前通过BIOS更改它.
抱歉这么长的问题,但不得不解释整个场景.
简而言之,用户没有互联网连接如何维护或获取日期/时间呼叫的合法来源?