【问题标题】:License Key for Java RCP application on VMIdVMId 上 Java RCP 应用程序的许可证密钥
【发布时间】:2011-09-03 14:16:05
【问题描述】:

我有一个基于 Java 1.6 构建的 RCP 应用程序。我在机器上使用虚拟机唯一 ID 作为数字来唯一标识一台机器并根据该数字生成许可证密钥。

我已经完成了基本测试,它似乎工作得很好。我能够唯一标识每台机器,并且 VMId 对于多个会话(重新启动、注销等)保持相同。此外,如果我将我的软件安装复制到另一台机器上,它也不起作用。

我唯一担心的是,如果这是为 RCP 应用程序构建许可算法的完美方式。他们是否有任何可能失败的边界边缘场景。我很担心如果有人更新他们的 java 软件,会不会改变 VMId。

等待专家意见,

纳温

【问题讨论】:

  • 你是如何计算 VMID 的?你在用java.rmi.dgc.VMID吗?
  • 是的,我正在使用相同的功能。这是正确的吗?

标签: java licensing virtual-machine rcp


【解决方案1】:

如果你看到java.rmi.dgc.VMID的默认构造函数

public VMID() 
{
    addr = localAddr;
    uid = new UID();
}

然后你会发现它取决于 IP 地址的hash(对于所有使用localhost 或@987654327 的机器来说都是一样的) @)。但是(以及它的一个但是),它还取决于java.rmi.server.UID

现在根据 javadoc:

独立生成的 UID 实例随着时间的推移是唯一的 只要主机需要,就生成它的主机 超过一毫秒重新启动并且它的系统时钟从未设置过 向后。

现在没有可用的机器可以在不到一毫秒的时间内重新启动。我见过的最快的是 MS-DOS(不确定启动时间)和 Google OS(需要 3-4 秒,根据他们的宣传)。

所以,如果它是唯一的因素,我会感到安全,但我仍会测试 setting the system clock backward 因素。


如果我必须在多台机器上使用您的产品但只为一台机器付费,那么我会将它安装在运行在 VMPlayer 或 VirtualBox 上的操作系统上。这样我就可以分发您的工具的多个副本。您是否检查过这种情况。

另外,在我的开发机器上,我通常有两个不同的 JDK(最新的一个用于玩玩,另一个用于客户端特定的开发)。众所周知,VMID 和 UID 类在多个 JVM 上存在一些问题。检查这个:http://www.velocityreviews.com/forums/t131825-can-we-generate-unique-id-from-java.html

另外,看看这个 javadoc:http://fuseyism.com/classpath/doc/java/rmi/dgc/VMID.html

通常,我所看到的许可策略涉及更多。就像(在 Windows 机器上)创建/使用一些注册表键值,由一些 Web 服务支持一次注册,向用户询问一些盐值(如他/她的姓名、年龄),然后从中生成许可证密钥。

所以,最后,如果您确定您的产品用户不会使用任何虚拟化技术(如 vmplayer 等),则不存在与多个 JVM 相关的问题,并且他们可能无法一次性激活互联网,然后就可以使用它。

但请记住,对于坚定的攻击者而言,没有任何软件很难破解,这从市场上可用的盗版/破解游戏和软件的数量可以看出。

【讨论】:

  • 好的,所以VMId对于连接到同一路由器的多台机器和独立机器来说是不同的。此外,它在重新启动之间也保持不变。我唯一要测试的是时间旅行。我不会关心 MS-DOS,它不是我的客户 :)。在将其推送到我的产品软件之前,我只是想知道是否有任何我可能会丢失的东西
  • 感谢您的详细回复。我将检查多个 VM 副本问题。此外,尽管我的用户在技术上并不幸运,但我不会挑战他们接受我的许可逻辑。我也在考虑集成授权加密狗等,虽然还没有解决如何有效地授权它。感谢您的帮助
  • 看来这可能不是最好的方法。如果客户端切换到备用网络连接,或者即使他没有连接到颁发许可密钥时使用的同一网络,具有多种网络方法(WIFI、LAN、调制解调器)的客户端也会遇到问题
猜你喜欢
  • 2011-09-24
  • 2012-01-24
  • 1970-01-01
  • 2012-06-09
  • 2017-06-12
  • 2017-05-16
  • 2017-04-25
  • 1970-01-01
  • 2012-02-29
相关资源
最近更新 更多