【问题标题】:Generating ID unique to a particular computer [duplicate]生成特定计算机独有的 ID [重复]
【发布时间】:2011-04-08 08:48:10
【问题描述】:

可能重复:
Reliable way of generating unique hardware ID

我正在尝试生成对特定计算机唯一的 ID。 ID不会随机生成。它将是基于计算的,这样为计算机A生成的ID将是固定的,对计算机A来说是唯一的。程序每次在计算机A上执行时,都会继续生成相同的ID,在另一台计算机上执行时,它会生成该计算机唯一的另一个 ID。这是为了确保两台​​计算机没有相同的 ID。

我的挑战:为了让我的程序能够生成计算机独有的 ID,它需要根据执行它的计算机独有的种子来执行计算。

我的问题:我怎样才能获得计算机独有的值,以便我可以将该值用作 ID 生成程序中的种子?

是否可以从计算机的硬件(例如主板)中获得该计算机独有的值?这样,只要不更换计算机的主板,该值很可能不会改变。

【问题讨论】:

  • 它不能以任何有意义的方式完成,也不能被一个有足够积极性的计算机所有者颠覆。如果您正在尝试找到一种方法,让设备能够将自己与其他设备区分开来,那么这是一个不同的问题,需要合作解决方案。
  • 没有物理组件的虚拟机呢?如果两个虚拟机具有相同的配置数据,它们是否是同一台机器?
  • 非常感谢你们的快速反应。是否可以获得计算机主处理器的 ID。我在互联网上的某个地方看到了类似的东西,但它是在 C# 中的。我想知道是否有可能在 Java 中实现相同的目标。

标签: java hardware uniqueidentifier hardware-id


【解决方案1】:

MAC 地址?那是(出于实际目的)unique to every NIC,因此即使用户是双启动,它也能保证重现性。当然很少有人会换卡,但是结合其他指标(不要只用这个,因为网卡是可以换的),还是有可能的。

你会怎么得到它?

public static byte[] getMACAddress() throws SocketException, UnknownHostException {
    InetAddress address = InetAddress.getLocalHost();
    NetworkInterface networkInterface = NetworkInterface.getByInetAddress(address);

    return networkInterface.getHardwareAddress();
}

如果您想要字符串表示,请执行此操作

for (int byteIndex = 0; byteIndex < macAddress.length; byteIndex++) {
    System.out.format("%02X%s", macAddress[byteIndex], (byteIndex < macAddress.length - 1) ? "-" : "");
}

(感谢http://www.kodejava.org/examples/250.html

注意: 如 cmets 中所述,Mac 地址可以被欺骗。但是您说的是一小部分人这样做,除非您将其用于反盗版,否则它就足够独特了。

【讨论】:

  • 在您链接到的同一个维基百科页面上,有一个指向en.wikibooks.org/wiki/Changing_Your_MAC_Address MAC 地址的链接不是唯一的。
  • 如果我更换网卡,请不要让我重新安装我的软件。
  • @EJP 95% 的时间,它们不会被用户欺骗。您谈论的一小部分人口 A)甚至知道如何做到这一点,B)偏执,C)关心。
  • @TheLQ 换句话说,它不是唯一的。
  • @EJP 不可能找到任何保证唯一的 id。即使是 2^128 位的随机数也不能保证是唯一的。其他人不太可能在相同的上下文中生成完全相同的数字。
【解决方案2】:

Win32 会生成一个计算机 SID,对于您可以通过 WMI 或 Active Directory 获取的每个安装,它应该是唯一的,但它是特定于平台的。您也可以使用 MAC 地址,正如其他人所提到的,只需确保它是物理网络适配器,因为虚拟适配器往往在计算机之间共享相同的 MAC 地址。

但是,UUID(或 GUID)是 128 位数字,应该保证唯一,实际上是为了解决在多个随机机器上生成唯一标识符的问题而创建的。根据维基百科:

从这些数字的角度来看, 一个人每年被击中的风险 陨石估计是一颗 170 亿的机会,[25] 这意味着 概率约为 0.00000000006 (6 × 10−11),相当于 创造数十万亿 一年内的 UUID 并拥有一个 复制。换句话说,只有在 每产生 10 亿个 UUID 在接下来的 100 年里, 只创造一个的概率 重复将是大约 50%。这 一个重复的概率是 如果地球上的每个人,大约 50% 拥有 6 亿个 UUID。

可能的组合总数为 2^128(或 3 x 10^38),所以我倾向于相信它。此外,大多数现代 UUID 生成器不再使用 V1 算法(即基于 MAC 地址的算法),因为它被认为是一个安全问题,因为人们可以知道 GUID 何时生成以及是谁生成的.在 Win32 世界中,大约 Win2K 或 NT 4 的安全补丁改为使用 V4 版本的算法,该算法基于伪随机数而不是 MAC,而 JVM 一直使用 V3/V4 版本。

编辑:在 Java 中用于生成 UUID 的方法是通过 java.util.UUID 类。

【讨论】:

  • 那么UUID.fromString("some string"); 会在多个虚拟机实例上生成完全相同的 UUID 吗?在同一台计算机上但在不同的操作系统上会怎样?
  • @TheLQ: "some string" 无法解析 :) 你读过ietf.org/rfc/rfc4122.txt 吗?
  • @TheLQ:语法为UUID.fromString("{00000000-0000-0000-0000-000000000000}"),用于将 UUID 的现有字符串表示形式转换为 UUID 类,所以是的,您每次都会得到相同的 UUID相同的输入值(假设您对输入字符串进行了硬编码)。要生成新的 UUID,您可以使用 UUID.randomUUID(),它在多个 VM 实例中应该是唯一的。
  • 我忘了说,但不同的操作系统也是如此。
  • UUID 不能解决任何问题。生成的数据必须存储在文件中。该文件可能被盗或复制。我需要一些属于系统/计算机的一部分并且不能通过获取设置文件而轻易被盗的东西。
【解决方案3】:

一个简单的方法是读取以太网硬件或“mac”地址。

http://download.oracle.com/javase/6/docs/api/java/net/NetworkInterface.html#getHardwareAddress()

Mac 地址并不像人们想象的那么独特,因为随着时间的推移它们确实会被重复使用。但是一个应用程序或网络拥有两个相同应用程序或网络的几率非常低。

【讨论】:

    【解决方案4】:

    MAC 地址对您来说是独一无二的。见http://en.wikipedia.org/wiki/MAC_address

    您没有指定您使用的语言。在某些语言中可能比其他语言更容易。这是在 Java http://www.kodejava.org/examples/250.html 中的操作方法。谷歌搜索你的语言。

    【讨论】:

    • 幸运的是,帖子标签 do 指定了他使用的语言。三个人在我完成输入之前给出了这个答案......我认为这是一个新记录。 :)
    【解决方案5】:

    您最好的选择是将 ID 基于主网络适配器的 MAC 地址。

    这可能会在某个时候发生变化,但任何单个硬组件也是如此。

    仅供参考的 GUID 使用 MAC 地址计算。

    【讨论】:

    • 哈哈... 4 个价格。
    【解决方案6】:

    您是否可以访问本文中描述的任何信息?仅限 Windows

    http://msdn.microsoft.com/en-us/library/aa394587.aspx

    序列号、资产标签

    【讨论】:

    • 序列号是和Windows相关的,还是实际厂商的序列号?
    • 与物理机柜有关。我确实指出这是一个仅限 Windows 的解决方案,如果它有效的话。
    【解决方案7】:

    另一个选项 IFF 您正在使用英特尔芯片是处理器序列号,假设您可以确保该功能已启用。请参阅Intel Serial # Note 了解更多信息

    【讨论】:

    • 他在使用 Java,没有处理器的概念 :)
    猜你喜欢
    • 2018-11-24
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2014-10-23
    • 2011-03-09
    • 2023-03-30
    相关资源
    最近更新 更多