我有一个基于 Java 1.6 构建的 RCP 应用程序。我在计算机上使用虚拟机唯一 ID 作为数字来唯一标识计算机并根据该数字生成许可证 key 。
我已经完成了基本测试,看起来效果不错。我能够唯一地标识每台计算机,并且 VMId 对于多个 session (重新启动、注销等)保持不变。此外,如果我将软件安装复制到另一台计算机上,它也不起作用。
我唯一担心的是,这是否是为 RCP 应用程序构建许可算法的完美方法。他们的边界边缘场景是否会失败?我非常担心如果有人更新他们的java软件,是否会改变VMId。
等待专家意见,
纳文
最佳答案
如果您看到java.rmi.dgc.VMID
的默认构造函数
public VMID()
{
addr = localAddr;
uid = new UID();
}
然后您会发现它取决于 IP 地址的哈希
(对于使用 localhost
或 127.0.0.1
的所有计算机来说,该哈希值都是相同的)。但是(这是一个大但是),它还取决于java.rmi.server.UID
。
现在按照 javadoc:
An independently generated UID instance is unique over time with respect to the host it is generated on as long as the host requires more than one millisecond to reboot and its system clock is never set backward.
现在没有可用的机器可以在不到一毫秒的时间内重新启动。我见过的最快的是 MS-DOS(不确定启动时间)和 Google OS(根据他们的宣传,需要 3-4 秒)。
因此,如果这是唯一的因素,我会感到安全,但我仍然会测试向后设置系统时钟
因素。
此外,在我的开发计算机上,我通常有两个不同的 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 服务支持进行一次性注册,询问用户一些盐值(例如他/她的姓名、年龄),然后从中生成许可证 key 。
所以,最后,如果您确定您的产品用户不会使用任何虚拟化技术(如 vmplayer 等),那么不存在与多个 JVM 相关的问题,并且他们可能没有可用于一次性激活的互联网,那么就使用它吧。
但请记住,对于坚定的攻击者来说,没有什么软件是很难破解的,市场上盗版/破解的游戏和软件的数量就证明了这一点。
关于java - VMId 上 Java RCP 应用程序的许可证 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7293645/