我在Java 1.6上构建了一个RCP应用程序。我在计算机上使用虚拟机唯一ID作为编号来唯一标识计算机并根据此编号生成许可证密钥。
我做了基本的测试,看起来效果很好。我能够唯一地识别每台机器,并且VMId在多个会话中保持相同(重新启动,注销等)。此外,如果我将我的软件安装复制到另一台机器上,它也无法正常工作。
我唯一担心的是,如果这是为RCP应用程序构建许可算法的完美方式。他们的任何边界边缘情况都可能失败。我很担心如果有人更新他们的java软件,那会改变VMId。
等待专家意见,
纳温
答案 0 :(得分:1)
如果您看到java.rmi.dgc.VMID
public VMID()
{
addr = localAddr;
uid = new UID();
}
然后您会在IP地址的 hash
上找到它取决于(对于使用{{1}的所有计算机都是如此}或localhost
)。但是(它的大但是),它还取决于127.0.0.1
。
现在按照javadoc:
独立生成的UID实例随着时间的推移是唯一的 只要主机需要,它就会生成主机 重启超过一毫秒,从未设置系统时钟 向后。
现在没有可用的机器在不到一毫秒的时间内重新启动。我见过的最快的是MS-DOS(不确定启动时间)和谷歌操作系统(需要3-4秒,根据他们的促销)。
所以,如果这是唯一的因素,我会感到安全,但我仍会测试 java.rmi.server.UID
因素。
<小时/> 如果我必须在多台计算机上使用您的产品但只支付一台,那么我会将它安装在运行在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相关的问题,并且他们可能没有互联网可用一次激活然后去实现它。
但请记住,对于坚定的攻击者来说,没有任何软件太难打破,因为从市场上可用的盗版/破解游戏和软件的数量可以看出这一点。