Java 计算机特定ID?
我正在尝试使用Java生成一个特定的计算机id。我曾经考虑过硬盘序列、Windows序列键、CPU ID或MAC地址,但其他计算机也可能有相同的。。例如,如果有人盗用Windows 7的副本,他们可能与其他人拥有相同的序列号。。我想知道是否有人能给我一种方法来生成一个计算机特定的ID,它永远不会改变,并且可以使用Java检索 我做了一些研究,发现了一些有用的函数。我在想这样的事情。但是如果他们改变了硬件,就会改变计算机ID。有人知道我可以用什么吗Java 计算机特定ID?,java,Java,我正在尝试使用Java生成一个特定的计算机id。我曾经考虑过硬盘序列、Windows序列键、CPU ID或MAC地址,但其他计算机也可能有相同的。。例如,如果有人盗用Windows 7的副本,他们可能与其他人拥有相同的序列号。。我想知道是否有人能给我一种方法来生成一个计算机特定的ID,它永远不会改变,并且可以使用Java检索 我做了一些研究,发现了一些有用的函数。我在想这样的事情。但是如果他们改变了硬件,就会改变计算机ID。有人知道我可以用什么吗 public String getCompute
public String getComputerID(){
InetAddress ip = InetAddress.getLocalHost();
NetworkInterface network = NetworkInterface.getByInetAddress(ip);
byte[] mac = network.getHardwareAddress();
String sn = getSerialNumber("C");
String cpuId = getMotherboardSN();
return MD5(mac + sn + cpuId);
}
public String MD5(String md5) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
byte[] array = md.digest(md5.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; ++i) {
sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
}
return sb.toString();
} catch (java.security.NoSuchAlgorithmException e) {
}
return null;
}
public String getSerialNumber(String drive) {
String result = "";
try {
File file = File.createTempFile("realhowto",".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.FileWriter(file);
StringBufferring vbs = "Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n"
+"Set colDrives = objFSO.Drives\n"
+"Set objDrive = colDrives.item(\"" + drive + "\")\n"
+"Wscript.Echo objDrive.SerialNumber"; // see note
fw.write(vbs);
FileWriter.close();
Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
BufferedReader input =
new BufferedReader
(new InputStreamReader(p.getInputStream()));
String line;
while ((line = input.readLine()) != null) {
result += line;
}
input.close();
}
catch(Exception e){
e.printStackTrace();
}
return result.trim();
}
public String getMotherboardSN() {
String result = "";
try {
File file = File.createTempFile("realhowto",".vbs");
file.deleteOnExit();
FileWriter fw = new java.io.FileWriter(file);
String vbs =
"Set objWMIService = GetObject(\"winmgmts:\\\\.\\root\\cimv2\")\n"
+ "Set colItems = objWMIService.ExecQuery _ \n"
+ " (\"Select * from Win32_BaseBoard\") \n"
+ "For Each objItem in colItems \n"
+ " Wscript.Echo objItem.SerialNumber \n"
+ " exit for ' do the first cpu only! \n"
+ "Next \n";
fw.write(vbs);
fw.close();
Process p = Runtime.getRuntime().exec("cscript //NoLogo " + file.getPath());
BufferedReader input =
new BufferedReader
(new InputStreamReader(p.getInputStream()));
String line;
while ((line = input.readLine()) != null) {
result += line;
}
input.close();
}
catch(Exception e){
e.printStackTrace();
}
return result.trim();
}
公共字符串getComputerID(){
InetAddress ip=InetAddress.getLocalHost();
NetworkInterface网络=NetworkInterface.getByInetAddress(ip);
字节[]mac=network.getHardwareAddress();
字符串sn=getSerialNumber(“C”);
字符串cpuId=getMotherboardSN();
返回MD5(mac+sn+cpuId);
}
公共字符串MD5(字符串MD5){
试一试{
java.security.MessageDigest md=java.security.MessageDigest.getInstance(“MD5”);
字节[]数组=md.digest(md5.getBytes());
StringBuffer sb=新的StringBuffer();
对于(int i=0;i
我确实认为您应该使用硬件配置文件中的内容计算机可以看作是一组硬件,包括网络接口。 一个典型的模式可以是MAC地址和通过网络管理计算机的管理系统生成的ID的组合
在向管理系统注册过程中唯一标识机器的MAC地址
作为注册的结果,管理系统可以返回生成的唯一ID,
存储在注册到它的计算机上,并将在以后使用
成功注册后,您可以更换网络接口卡,因为计算机不依赖于要识别的MAC地址
您也可以考虑使用Linux dMIDECODE实用工具
(对于Linux机器,
,因为您提供了一个基于WINDOWS的解决方案,
所以对于我们的Linux读者来说,
我想推荐一个Linux替代品)(如果您想要唯一标识的机器有Linux和DMIDECOE安装)。BR> 使用dmidecoe,您可以获得更多的硬件配置文件,并对其执行一些哈希函数,并生成一个唯一的ID,该ID将唯一地(准确地说是高概率地)标识您的机器
阅读更多关于dmidecode的信息
当然,如果您采用“从操作系统获取硬件信息”的方法(即dmidecode或您在获取MAC地址后的部分建议的方法,
您需要一个跨平台的代码来检查java程序运行的操作系统是什么,您可以使用以下命令来完成:
System.getProperty("os.name");
在查看了每个人的输入和不少谷歌搜索之后,我得出了这个结论
从技术上讲,如果您移除一个组件并替换它,它将是一台全新的计算机,要生成一个真正的计算机特定ID,您必须从系统中的每个组件(即序列号)中获取一个特定变量,将它们全部合并,这将是一个“计算机特定ID”。但是,由于计算机很容易发生更改,因此最接近的可能是使用最不可能更改的组件,并使用其中的特定变量作为计算机ID。这通常是主板或其他不可能更改的组件。因此,最接近的可能是序列号(或其他一些子组件)的主板..在我个人看来
为什么主板最不可能更改?
似乎主板是人们考虑改变的最后一部分,特别是在新的计算机上。除非绝对需要,否则它们不会正常改变。另一个可行的选择是NIC。
/**
* Execute system console command 'vol' and retrieve volume serial number
*
* @param driveLetter - drive letter in convetion 'X:'
* @return - Volume Serial Number, typically: 'XXXX-XXXX'
* @throws IOException
* @throws InterruptedException
*/
static final String getVolumeSerial(String driveLetter) throws IOException, InterruptedException {
Process process = Runtime.getRuntime().exec("cmd /C vol " + driveLetter);
InputStream inputStream = process.getInputStream();
InputStream errorStream = process.getErrorStream();
if (process.waitFor() != 0) {
Scanner sce = new Scanner(errorStream);
throw new RuntimeException(sce.findWithinHorizon(".*", 0));
}
Scanner scn = new Scanner(inputStream);
// looking for: ': XXXX-XXXX' using regex
String res = scn.findWithinHorizon(": \\w+-\\w+", 0);
return res.substring(2).toUpperCase().trim();
}