在Linux中获取计算机序列号的系统调用

6

我知道这很困难,但在Linux上有没有获取序列号或唯一标识信息的方法?

如果有,如何将其编程到Java程序中?

在这种情况下,我需要构建一个许可证验证器,将其锁定到一台机器上。如果你有其他建议,欢迎提出。

5个回答

6
这是 Lennart Poettering 的一篇关于 ID 的博客文章摘录,与安全无关,主要讲述唯一性 ID 的概念。博客文章
  • /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似乎是您验证守护程序的一个好选择,但这意味着您的验证代码需要以特权用户身份运行。完整的博客文章确实是非常有价值的阅读!


3

除非您能够将硬件加密狗真正地送到用户的机器上,否则无法设计一种无法被绕过的副本保护设置。

如果您只想告诉用户“嘿,您已经在网络中的另一台机器上运行此许可证,请获取另一个许可证”,那么一个好方法是进行网络广播,以便它们可以找到彼此。最简单、最可靠的方法可能是使用jmdns库的Zeroconf。

如果您想确保该程序仅在具有给定序列号的一个位置运行,则在通用PC上唯一的方法是在运行时调用互联网上的中央服务器并注册其使用位置。然后,母船返回一个包含需要运行的重要代码片段。您很可能可以使用Java WebStart来实现这一点。


我在问题中忘记提到该设备无法通过互联网拨打家庭电话。 - Candyfloss
如果你需要这个方案是完美无缺的,那么我建议你选择商业解决方案。 - Thorbjørn Ravn Andersen

0

我使用MAC地址作为唯一标识符。

InetAddress address = InetAddress.getByName("192.168.1.1");
NetworkInterface ni = NetworkInterface.getByInetAddress(address);
byte[] mac = ni.getHardwareAddress();

在1.6版本之前,获取MAC地址相当棘手,如果我没记错的话。我认为需要使用本地代码或解析命令行输出。 - Sam Brightman

0

MAC地址是可以更改的。请查看this。此外,MAC地址与接口(以太网/无线/HPNA等)绑定。因此,聪明的用户可以轻松地进行调整。在stackoverflow上讨论了类似的问题。请查看this


-1
MAC地址不是一个好的选择,因为它可以在某些系统上更改。如果您想保持本机Java,则诸如机器ID和用户登录帐户之类的逻辑系统参数是您唯一的选择。对于某些情况来说,机器名称足够安全,因为在一个网络中不能有两台具有相同名称的计算机。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接