2

我开发了想要通过许可保护的软件。到目前为止,我已经获得了使用硬件组件的详细信息为每台机器生成唯一 ID 的代码。然后,我可以允许针对一个序列密钥激活 5 台机器(我出售的是每个许可证 5 台机器)。

这一切都很好,但显然只在有互联网连接的机器上。这只是这种保护的限制,我对此无能为力吗?或者有什么办法可以解决这个问题?

注意:在这一点上,在这个线程中,我不会批评我生成唯一 ID 的方式,这是我选择的方法,而且相当无知,需要坚持一段时间原因。

4

2 回答 2

2

要求拥有中央许可服务器。启动时的每个程序都会向该服务器注册。服务器告诉客户端它是否可以启动。如果已经启动了 5 个程序,则程序拒绝启动。

当程序停止时,它会再次告诉许可服务器不再需要它的许可证。

任务完成。无需互联网。

于 2012-08-29T14:36:54.723 回答
2

我认为你有几个选择:

  1. 如评论中所述,不要通过将所有允许机器的唯一 ID 合并到密钥中来使您的许可证浮动,而是特定于机器。启动时根据密钥检查当前机器的唯一 ID
  2. 使用您当前的方法,但不同之处在于服务器不在您身边,而是在客户的前提下,即客户需要安装在某处的许可证服务器。
  3. 实施某种自检:每个运行实例将其唯一 ID 发送到网络,然后监听其他运行实例的唯一 ID。通过网络接收超过四个唯一 ID 的第一个实例会自行关闭。我想这可以使用 UDP 广播来实现。这个的实现并不是那么简单:

    • 您需要确保退出一个实例并在之后立即启动一个新实例不会导致其他地方关闭。
    • 此外,您可能希望检查机器是否确实联网

    如果我要实现类似的东西,我会介绍以下三种包类型:

    • 启动:实例刚启动并第一次广播它的ID。所有其他实例都需要广播自己的 ID 作为答案。原因有两个:
      1. 快速失败
      2. 理想情况下,如果超过了允许的最大实例数,则最后启动的实例应该退出。如果已经运行的实例之一关闭,那将是不理想的。
    • 定期:所有实例都会定期发送其唯一 ID,以防之前的传输丢失
    • 退出:如果一个实例被关闭,它会告诉其他实例这个事实

在所有情况下,您都应该考虑将允许的实例数编码到密钥中,以便以后可以分发不同大小的密钥。

于 2012-08-29T14:23:55.430 回答