1

可能重复:
如何在 Java 中获取唯一的计算机标识符(如磁盘 ID 或主板 ID)

我正在创建一个小型 Java 程序。在那里,我正在创建一个名为“James.txt”的文件。我正在使用此文件来检查程序是否已从 James 计算机中移出。我在那里所做的是,将 Jame 的计算机的 IP 地址写入该文件。因此,当他在控制台中启动程序时,它会首先检查文件并说“Hey James!Suprise!!!”,如果 IP 不属于 james,它会打印“Sorry, This is for James聚会”。

但是,情况是,即使在同一台PC上也可以更改IP地址,对吗?那么,如何才能唯一标识詹姆斯电脑呢?请帮忙!

4

6 回答 6

2

如果 NIC 更改,MAC 地址将更改。主板可能会出现故障并被更换。这同样适用于处理器 ID、硬盘 ID 和其他东西。

底线——

  • 为您的应用程序开发标识符
  • 让您的应用程序在用户的计算机上维护一个标识符
  • 当您的应用程序要求用户使用 userid/password/biometrics 来识别他/她自己时,也要验证标识符,然后显示您必须的消息。
于 2012-05-16T17:50:48.350 回答
2

从技术上讲,您无法唯一识别任何计算机,因为一切都可能被“欺骗”。如果您知道如何操作,您甚至可以像更改 IP 一样轻松更改 MAC 地址。

话虽如此,一些系统试图计算可用于定义半唯一实例的值组合。通常这些来自硬件标识符,例如:

  • MAC地址
  • 硬盘标识符
  • CPUID

然后将它们以某种方式混合在一起,以提供具有一定更改容错性的唯一密钥(如硬件升级)。在某些系统中还有一个生成的标识符,称为 UUID,它是在构建文件系统时创建的。

要访问其中的一些,您可能需要使用 JNI。其中一些是有争议的(CPUID),因为它们可用于跟踪互联网上的人,从而降低他们的匿名性。

某些应用程序(如 Web 浏览器)经常无法访问这些内容。建立登录/密码形式的安全性可能更容易。

于 2012-05-16T17:58:12.123 回答
1

IP 地址可能会经常更改(例如使用 DHCP 分配) 我建议使用磁盘或主板的序列号进行识别。

如何在 WINDOWS 上获取这些序列号的示例可以在这里找到:

http://www.rgagnon.com/javadetails/java-0580.html(包括源代码,平台相关)

于 2012-05-16T17:48:01.380 回答
1

您可以使用 Java 注册表将一个简单的值写入系统注册表。这将适用于 Linux 和 Windows,并且是一种非常基本的方法。不安全且很容易破解,但至少它是便携的。

您可以参考使用 Java 读取/写入 Windows 注册表以获得一些很好的示例。

于 2012-05-16T17:39:50.703 回答
1

无法保证计算机没有变化。您最好的选择是在首次运行时将密钥文件写入机器,然后您可以使用该文件进行检查。虽然这可以被删除,但只要您使用合理的哈希算法来生成您的密钥(即您可以确信没有其他人可以生成它),它就会看起来有所不同,那么您可以很高兴保证您得到正确的匹配当密钥匹配时。这种方法会让你对肯定的识别充满信心,但会让你容易接受假阴性,这通常不是问题。您应该根据一些可用作参考的加盐输入来使用类似于 SHA 算法的东西。

于 2012-05-16T17:42:07.153 回答
1

用纯 Java 可以做的任何事情都不会对故意想要“破坏系统”的精通技术的用户非常有效。

但是,尽管如此,您可以在纯 Java 中做一些低技术含量的事情:

  • 继续并存储 MAC 地址;它并不完全可靠,但实际上大多数用户不会更改他们的 MAC 地址;
  • 分配一个随机的 UUID 并使用 Preferences 架构将其存储在机器上;然后,将该 UUID 或其安全哈希存储在程序的本地目录中。

这些系统中的任何一个都很容易被精明的用户使用。但归根结底,精明的用户可能会篡改您的课程文件以绕过您采取的任何措施。

MAC 地址的缺点是程序外部存在“合法”情况,MAC 地址可能会更改,因为用户可能会更改他们的网络设备。

于 2012-05-16T17:43:51.870 回答