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

Posted

技术标签:

【中文标题】基于订阅的软件许可 - 离线验证【英文标题】:Subscription based licensing your software - Offline validation 【发布时间】: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 更改它。

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

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

【问题讨论】:

您还没有接受任何答案。我想知道你的发现。您在软件中实现了什么? 【参考方案1】:

您可以进行以下程序:

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

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

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

对不起我的英语!

【讨论】:

您的解决方案与上面的类似,是的,即使我想到了,但是如果用户在系统启动之前使用 BIOS 更改时间,逻辑就会失败。 @Genocide_Hoax 我不明白你的意思!用户更改时间的地点或时间无关紧要,因为您将先前的时间存储在磁盘上并在启动时检查您没有当场抓住用户当他更改时间时,您只是检测到他在某个时候更改了它 【参考方案2】:

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

最简单的可能只是需要互联网连接。但我们已经看到了 Xbox 和其他游戏公司对此的接受程度。

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

请注意,用户调回时钟可能有正当理由。夏令时是其中之一。或许可以使用一个阈值,例如忽略时钟倒退一小时或一天之类的。

【讨论】:

同意。在许可方面没有所谓的完全证明,80% 对我有用:)。但是,如果我在 BIOS 上更改了时间,您提供的解决方案将不起作用,正如我在问题中提到的那样,我不需要在启动后更改它。感谢您提到日光因素,我差点错过了。 不过话说回来,有很多软件可以跟踪计数器(有或没有互联网),破解它们的唯一方法是更改​​exe。如果我能达到那个地步,我会很高兴。我知道没有人愿意对我的软件进行逆向工程 :)。【参考方案3】:

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

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

【讨论】:

什么是列表算法?

以上是关于基于订阅的软件许可 - 离线验证的主要内容,如果未能解决你的问题,请参考以下文章

Java:通过软件或服务器进行许可证身份验证和验证?

office 2010 无法验证此应用程序的许可证

linux的许可证替代[关闭]

Microsoft Office无法验证此产品的许可证怎么办

Microsoft Office 无法验证此应用程序的许可证。

在 Python 中使用 RSA 公钥验证签名的许可证密钥