系统调用获取linux中的机器序列号(用java编程)

我知道这是一个远射,但有什么办法在linux获得序列号或唯一可识别的信息?

如果是的话,如何编程到Java程序?

在上下文中,我需要build立一个locking到一台机器的许可validation器,如果你有任何其他的build议,欢迎。

提前致谢

以下是Lennart Poeterring关于ID的一篇博客文章的摘录。 它是关于唯一的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好像是一个很好的候选人,但是需要你的验证代码作为特权用户来运行。 完整的博客文章真的是一个有价值的阅读!

除非实际上可以将硬件加密狗连接到用户机器,否则不能设计出无法绕过的复制保护设置。

如果你只是想告诉用户:“嘿,你已经在你的网络上的另一台机器上运行这个许可证,获得另一个许可证”,那么一个好办法是做网络广播,以便他们可以找到另一个。 最可靠的最简单的方法是使用Zeroconf和jmdns库。

如果你想确定程序只是在一个具有给定序列号的地方运行,那么使用通用PC的唯一方法就是在程序运行的时候让程序在互联网上调用一个中央母线,并在其中注册正在使用。 母船然后返回包含需要运行的重要代码的片段。 你可能很可能使用Java WebStart来实现这一点。

我使用MAC地址作为唯一的ID。

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

Mac地址可以更改。 检查这个 。 此外,Mac地址绑定到一个接口(以太网/无线/ HPNA等)。 所以一个聪明的用户可以很容易地调整。 在stackoverflow上讨论了类似的问题。 检查这个 。

MAC地址不是一个好的选择,因为它可以在一些系统上进行更改。 如果你想留在原生的Java,那么逻辑系统参数,如机器ID和用户登录帐户是唯一的选择。 对于一些情况,机器名称是足够安全的,因为一个网络中不能有两台机器具有相同的名称。