cryptography - keygen-shoffline-license-check 如何验证许可证是否过期?

标签 cryptography licensing

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

Validation request failed e.g. timeout

The failure could be for a number of reasons, but the most likely culprit is that your user doesn't have an active internet connection. You could handle this in a variety of ways, but here are a few ideas:

  1. Begin a grace period (e.g. 30 days or 5 additional product usages), where you disallow access to the product if a license validation has not been successful after that timeframe. You should clearly tell your users that they should connect to the internet when possible and be upfront about the grace period.

  2. Immediately disallow access to the product. This should be used with care, and is not recommended unless your product relies on an active internet connection.

  3. Fallback to offline license key validation if you're utilizing cryptographically signed or encrypted license keys (see the API reference for more information).

对于选项 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 header 中找到),并将其存储到文件系统中,例如也许是一个名为 cache.sig 的文件。

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

现在,如果没有事件的互联网连接并且缓存不存在,那么您可能需要转到选项 2,即禁止使用该程序,因为没有证据表明已提供有效的许可证 key 。或者,我们可以利用选项 3 并提示输入加密签名的许可证 key ,并在离线环境中进行验证。

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

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

关于cryptography - keygen-shoffline-license-check 如何验证许可证是否过期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65621015/

相关文章:

ios - 过渡到新的加密算法

c++ - 如何在 C++ 中使用多个签名者实体验证 PKCS7 签名

web-applications - 如何为 webapps 的现场安装(最好是跨平台的)实现许可证管理?

python - 如何保护 Python 代码不被用户阅读?

cryptography - 在 JDK 1.8 中找不到 RSA/NONE/NoPadding 提供程序

c# - 我应该为表中的密码字段使用什么? MD5 还是 SHA1?

javascript - aes.js 和 crypto.js 最佳使用

c++ - 为自制操作码列表创建 C++ 编译器/链接器

open-source - 对于那些想要归属的人来说,最好的开源许可证?

open-source - GPL 和 LGPL 开源许可限制