我想实现一个基于this article的简单许可系统。
一切正常。但现在我想添加一个到期日期,我不知道如何。
有人可以解释一下如何添加到期日期吗?确切地知道如何实现并不重要,但我需要理解它背后的算法:)
答案 0 :(得分:5)
最有用的方法是让服务器检查密钥是否仍然有效。这使得很难伪造。
但是如果您不想(出于某种原因)使用“在线”技术,那么您需要将过期日期存储在客户端使用的数据中的某个位置。它可以加密,但您的软件必须包含解密密钥。因为在某些时候,您的申请必须将当前日期与到期日期进行比较。
正如其他人所说的那样,很容易花费很多精力让这很难打破,但迟早,它归结为一些简单的比较“它是否在约会?”,并且该代码可以通过替换if (!in_date) exit_with_message("License expired...");
ith if (false) ...
来永远“破碎”。所以,除非你在100多个不同的地方做那种事情,并且使代码在每个地方看起来都非常不同[不要调用相同的函数,不要使用相同的消息,不要使用相同的计算,不要使用相同的结果等,等等]
我想使用我们在家用机器上工作时使用的编译器[在家里做一些与工作相关的项目!]。它内置了一个“演示许可证”,所以你可以尝试一下,但它在10000行源代码后停止了。所以我在二进制文件中查找了所有出现的10000。我认为有三个地方包含10000个。我改变了一个,尝试编译超过10000行的测试样本,它仍然失败了 - 改回来改变了下一个:wohoo,它有效......现在,编码器可能会让它变得更难,但如果我感兴趣的话,我相信我也能解决这个问题。这比获得第二个许可证,在家用机器上安装许可证服务器等等要容易得多。
还要记住,大多数打破这种事情的人不是为了金钱,而是为了挑战。如果这很难,那只是一个更大的动力!
编辑:
我会做这样的事情:
1)创建一个license.dat,其中包含:
2)加载软件[或在软件中定期加载]时,请加载license.dat。
3)验证许可证文件的哈希值。
4)检查当前日期是否大于失效日期。
5)如果检查完毕,请继续,否则退出一些相关消息。
确切地说,如何存储/加密日期是我无法真正建议的。一个选项是64位整数,根据time_t
(以秒为单位的时间)进行了适当的“加扰”。加密可能更多的是“不要让它显得太明显,它是一个时间戳” - 但哈希真的是保护你的时间戳。