我知道这很困难,但在Linux上有没有获取序列号或唯一标识信息的方法?
如果有,如何将其编程到Java程序中?
在这种情况下,我需要构建一个许可证验证器,将其锁定到一台机器上。如果你有其他建议,欢迎提出。
我知道这很困难,但在Linux上有没有获取序列号或唯一标识信息的方法?
如果有,如何将其编程到Java程序中?
在这种情况下,我需要构建一个许可证验证器,将其锁定到一台机器上。如果你有其他建议,欢迎提出。
/sys/class/dmi/id/product_uuid:主板产品UUID,由主板制造商设置并编码在BIOS DMI信息中。它可用于识别主板,仅限于主板。当用户更换主板时,它会发生变化。此外,经常有BIOS制造商将虚假序列号写入其中。此外,它是x86特定的。未授权用户无法访问。因此,它在一般情况下用处不大。
CPUID / EAX = 3 CPU序列号:CPU UUID,由CPU制造商设置并编码在CPU芯片上。它可用于识别CPU,仅限于CPU。当用户更换CPU时,它会发生变化。此外,大多数现代CPU不再实现此功能,并且旧计算机往往默认禁用此选项,可通过BIOS设置选项进行控制。此外,它是x86特定的。因此,这也没有太多一般用途。
因此,/sys/class/dmi/id/product_uuid
似乎是您验证守护程序的一个好选择,但这意味着您的验证代码需要以特权用户身份运行。完整的博客文章确实是非常有价值的阅读!
除非您能够将硬件加密狗真正地送到用户的机器上,否则无法设计一种无法被绕过的副本保护设置。
如果您只想告诉用户“嘿,您已经在网络中的另一台机器上运行此许可证,请获取另一个许可证”,那么一个好方法是进行网络广播,以便它们可以找到彼此。最简单、最可靠的方法可能是使用jmdns库的Zeroconf。
如果您想确保该程序仅在具有给定序列号的一个位置运行,则在通用PC上唯一的方法是在运行时调用互联网上的中央服务器并注册其使用位置。然后,母船返回一个包含需要运行的重要代码片段。您很可能可以使用Java WebStart来实现这一点。
我使用MAC地址作为唯一标识符。
InetAddress address = InetAddress.getByName("192.168.1.1");
NetworkInterface ni = NetworkInterface.getByInetAddress(address);
byte[] mac = ni.getHardwareAddress();