我想在每台计算机上获得一个Java程序的唯一序列号,我可以使用什么? Mac地址好帽子是我遇到的问题的代码吗?
一个已经有这两个哪个更好?
public static void main(String[] args){
InetAddress ip;
try {
ip = InetAddress.getLocalHost();
System.out.println("Current IP address : " + ip.getHostAddress());
NetworkInterface network = NetworkInterface.getByInetAddress(ip);
byte[] mac = network.getHardwareAddress();
System.out.print("Current MAC address : ");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i++) {
sb.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
}
System.out.println(sb.toString());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e){
e.printStackTrace();
}
}
}
public static void main(String[] args) throws Throwable {
// wmic command for diskdrive id: wmic DISKDRIVE GET SerialNumber
// wmic command for cpu id : wmic cpu get ProcessorId
//wmic command for bios :wmic bios get serialnumber
Process process = Runtime.getRuntime().exec(new String[] { "wmic", "csproduct", "get", "uuid" });
process.getOutputStream().close();
Scanner sc = new Scanner(process.getInputStream());
String property = sc.next();
String serial = sc.next();
System.out.println(property + ": " + serial);
}
一起使用ProcessorId和uuid也是一种好方法吗?
最佳答案
据我所知,没有什么是可以访问硬件的人不能伪造的。
如果您具有管理员权限,则可以在典型操作系统上的软件中相对容易地更改NIC的MAC地址。
ProcessorId(由“ wmic”报告)更难,因为它来自BIOS,并且OS将其视为只读属性;参见How to change the ProcessorId。
然而:
可能可以通过BIOS本身更改ID,
用户可能会替换BIOS,
用户可能会更新BIOS读取ProcessorId
值的专用内存位置(?)。
如果您的代码使用“ wmic”来检索ProcessorId,则将其替换为返回假ID的版本是可行的
等等
另请参阅:WIN32_Processor::Is ProcessorId Unique for all computers
即使假设您可以阻止用户伪造ID,但如果他们可以旋转虚拟机,他们几乎可以肯定会在虚拟机中伪造ID。
这意味着您开发的任何依赖于标准股票Windows系统具有唯一,不可伪造(不可克隆)标识符的方案都存在根本缺陷。如果您确实需要不可伪造的ID,则必须考虑其他方法,例如防篡改的硬件“加密狗”。
另一方面,如果您愿意接受用户可能伪造ID信息,则将MAC地址,ProcessorId和/或4类UUID组合起来对于唯一性应该足够了。 (实际上,只要您拥有良好的随机数来源,仅类型4 UUID就足够了。)
关于java - 在每台计算机中什么是完全唯一的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51353208/