微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

keygen-sh offline-license-check 如何验证许可证是否过期?

如何解决keygen-sh offline-license-check 如何验证许可证是否过期?

我编写了一些希望出售给最终用户的软件,我正在研究许可证服务器。 Keygen-sh 在他们的网站 (https://keygen.sh/docs/validating-licenses/) 上提到了当用户在尝试使用 keygen 的服务器验证他们的许可证时离线时要做什么。我对选项三感兴趣:

验证请求失败,例如超时

失败可能是因为 原因很多,但最有可能的罪魁祸首是您的用户 没有有效的互联网连接。你可以在一个 方法多种多样,但这里有一些想法:

  1. 开始宽限期(例如 30 天或 5 次额外产品使用), 如果许可证验证具有,则您禁止访问该产品 在那个时间范围之后没有成功。你应该清楚地告诉你 用户应尽可能连接到互联网 提前了解宽限期。

  2. 立即禁止访问 产品。这应该小心使用,除非是不推荐的 您的产品依赖于有效的互联网连接。

  3. 回退到 如果您以加密方式使用,则离线许可证密钥验证 签名或加密的许可证密钥(有关更多信息,请参阅 API 参考 信息)。

在选项 1 的情况下,我应该如何检查自他们上次活动的互联网连接以来已经过去了 30 天?如果我将最后日期存储在 .txt 文件中,他们可以简单地删除文件

这让我想到了选项 3。但是加密检查如何验证过期呢?代码 (https://github.com/keygen-sh/example-python-cryptographic-verification) 似乎没有使用系统时间。

我知道我无法阻止我的软件被破解。但它不应该像删除文件或切断互联网连接那样简单。假设他们不会篡改系统时间,也不会反编译我的代码

解决方法

我是 Keygen 的创始人 - 让我尝试澄清这里的选项。这些选项实际上并不相互排斥,因此您可以同时执行选项 1、2 和 3,具体取决于一些变量。

你的想法在这里或多或少是正确的。您可以将日期时间存储在 txt 文件中,或存储在其他一些存储方式中,但正如您所说,它会带来篡改的风险。为了防止这种情况,我通常建议做的称为许可证验证缓存。这是将成功的许可证验证请求与请求的加密签名一起缓存以备后用的位置。

这里有一个这样做的例子是 Node:https://github.com/keygen-sh/example-validation-caching(我知道你在使用 Python,所以请耐心等待。)

本质上,当您执行许可证验证请求时,您会希望将响应正文缓存到文件系统中,例如一个名为 cache.json 的文件,以及缓存响应正文的加密签名,在响应的 X-Signature 标头中可用,并将其存储到文件系统中,例如可能是一个名为 cache.sig 的文件。

当没有可用的活动互联网连接时,您可能想要尝试从该缓存中读取数据,如果数据存在,您将使用 RSA PKCS v1.5 填充(类似于您链接的示例)以加密方式验证缓存的数据和签名) 以确保它没有被篡改(即您提到的将原始日期时间存储在 txt 文件中的问题)。如果存在缓存数据,并且在验证其真实性后,您将解码缓存的 JSON 数据并检查过期时间。

现在,如果没有活动的 Internet 连接并且缓存不存在,那么您可能希望转到选项 2,即禁止使用该程序,因为没有证据表明曾经提供过有效的许可证密钥.或者,我们可以使用选项 3 并提示输入加密签名的许可证密钥,并在离线环境中进行验证。

如果您确实使用选项 3,由于您似乎还想离线检查过期时间,您需要在许可证密钥本身中嵌入过期时间戳。因为 API 不会自动将任何数据嵌入到加密签名(或加密)的许可证密钥中。在没有任何缓存的完全离线环境中,您将无法从 API 访问完整的许可对象,这意味着您只能拥有嵌入在密钥本身中的数据。

我继续为您创建了一个使用 Python 执行此操作的示例:https://github.com/keygen-sh/example-python-offline-validation-caching

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?